正则匹配模式分为两种,一种是贪婪模式,另一种是非贪婪模式
贪婪模式:在遇到歧义时候尽可能的多的匹配符合的结果
非贪婪匹配:在遇到歧义时候匹配到一次符合的结果就不匹配了
js默认是贪婪匹配模式,贪婪模式变成非贪婪模式只需要在贪婪量词({n, }, {n, m}, + , ?, *)后面加一个?就行了
附加: 正则匹配中?的几种用法
正则匹配的前瞻就是给正则匹配的选项定义一个断言,或者说是一个条件比如:我要匹配一个字母,但是我的需求是字母后面必须是跟着一个数字的情况,那么这种场景是怎么实现了,就是用到前瞻的概念,那么我想要他的前面也要是一个数字怎么办了,这就是后顾。
前瞻后顾的描述
正则匹配新特性
以上的三个匹配形式都是不被捕获的,其中前两个是不匹配的,他只是用来当作条件来用,第三个是要被匹配的
1:任何元字符在没有写量词的情况下,只匹配一次
2:写了量词,默认是贪婪匹配
3:正则匹配一旦全部找到就不会在继续去匹配,除非你设置了全局g
4:正则匹配按照匹配规如果中间中断没有匹配到,并且字符串没有匹配完,会继续按照匹配规则重新匹配
5:(pattern)如果匹配到了很多结果,只捕获最后一次匹配到的结果
6:任何量词都只作用于前面的元字符
1:source 2:global 3:ingoreCase 4:multiline 5:lastIndex
字符串满足正则匹配规则就会返回true,但是如果正则匹配里面含有全局的话,那么多运行几遍会报错,因为正则每次匹配开始都是看lastIndex的,全局情况下lastIndex每次执行都会被改变
如果没有找到任何匹配就返回null,如果找到了则返回一个数组,exec方法返回的数组的第 0 个元素是与正则表达式相匹配的文本
第 1 个元素是 正则匹配到 的第 1 个子表达式相匹配的文本(如果有的话)
第 2 个元素是正则匹配到 的第 2 个子表达式相匹配的文本(如果有的话)
...
以此类推。
其中还有三个参数
index:表示匹配到的文本的第一个字符所在的索引位置
input: 表示被匹配的文本
groups:表示有名的分组
在全局下也是一样因为exec永远只返回第一个匹配。
如果没有找到任何匹配就返回null,如果找到了则返回一个数组,match方法返回的数组的第 0 个元素是与正则表达式相匹配的文本
第 1 个元素是 正则匹配到 的第 1 个子表达式相匹配的文本(如果有的话)
第 2 个元素是正则匹配到 的第 2 个子表达式相匹配的文本(如果有的话)
...
以此类推。
其中还有三个参数
index:表示匹配到的文本的第一个字符所在的索引位置
input: 表示被匹配的文本
groups:表示有名的分组
在非全局的情况下,这个方法和exec一模一样,但是在全局的情况下,差别很大,在全局的情况下,只会返回匹配到的结果,并且lastIndex始终为0, 如果没匹配到就返回null
该方法用来替换字符串,第一个参数是正则表达式,第二个参数可以是字符串也可以是函数
正则匹配测试工具
一. 正则表达式
正则表达式:其实就是一种匹配规则,用于检索字符串
定义正则表达式的两种方式:1.直接定义 2.构造函数定义
那么正则表达式正则强大的地方是它可以写 通配符(拥有特殊含义的字符)
二. 通配符
\w 表示:字母、数字、下划线
\W 表示:除了字母、数字、下划线以外的字符
\d 表示:数字
\D 表示:非数字
^ 表示:以^符号后面的第一个字符开头
表示:以表示:以符号前面的第一个字符结尾
{n} 表示:重复n次
{n,m} 表示:重复n到m次
[xyz] 表示:其中任意一个字符
+ 表示:重复前一项1次或多次 等价于 {1,}
* 表示:重复前一项0次或多次 等价于 {0,}
? 表示:重复前一项0次或1次 等价于 {0,1}
. 表示:除了换行符以外的任意一个字符
\. 表示:.字符 ^ 表示:^ \表示:表示:
可以用()将多个字符作为一个整体
\w 等价于 [0-9a-zA-Z_]
| 表示:或者
[\u4E00-\u9FA5] 是常用汉字的unicode编码范围
三. 正则练习
四. 正则表达式配合字符串的方法
replace()方法
默认情况下,replace()方法,只会替换字符串中匹配的第一段内容
使用正则表达式,添加全局匹配修饰符g,可以替换匹配全部内容
使用正则表达式,添加忽略大小写修饰符i,在匹配内容时会忽略大小写
search()方法
可以通过正则表达式查找位置
五. 添加学生练习
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>添加学生</title>
<style>
.err{
color: red
}
.ok{
color: green
}
</style>
</head>
<body>
<form>
<table>
<tr>
<td>姓名:</td>
<td>
<input type="text" id="name">
<span id="nameMsg"></span>
</td>
</tr>
<tr>
<td>年龄:</td>
<td>
<input type="text" id="age">
<span id="ageMsg"></span>
</td>
</tr>
<tr>
<td>性别:</td>
<td>
<input checked name="sex" type="radio" value="0">男
<input name="sex" type="radio" value="1">女
</td>
</tr>
<tr>
<td>爱好:</td>
<td>
<input name="hobby" type="checkbox" value="抽烟">抽烟
<input name="hobby" type="checkbox" value="喝酒">喝酒
<input name="hobby" type="checkbox" value="烫头">烫头
<input name="hobby" type="checkbox" value="睡觉">睡觉
</td>
</tr>
<tr>
<td>年级:</td>
<td>
<select id="grade">
<option value="0">请选择</option>
<option value="1">大一</option>
<option value="2">大二</option>
<option value="3">大三</option>
<option value="4">大四</option>
</select>
<span id="gradeMsg">必须要选择一个年级</span>
</td>
</tr>
<tr>
<td>邮箱:</td>
<td>
<input type="text" id="email">
<span id="emailMsg">请输入正确的邮箱格式</span>
</td>
</tr>
<tr>
<td>电话:</td>
<td>
<input type="text" id="phone">
<span id="phoneMsg">请输入正确的电话格式</span>
</td>
</tr>
<tr>
<td>生日:</td>
<td>
<input type="text" id="bornDate">
<span id="bornDateMsg">请输入正确日期格式</span>
</td>
</tr>
<tr>
<td></td>
<td>
<button type="submit">提交</button>
<button type="reset">重置</button>
</td>
</tr>
</table>
</form>
<script>
//获取姓名文本框
let name = document.querySelector('#name')
//获取年龄文本框
let age = document.querySelector('#age')
//表单的提交事件
document.querySelector('form').onsubmit = function(){
// 返回true提交表单,返回false不提交表单
if(checkName() &checkAge()){
return true
}else{
return false
}
}
//姓名文本框失去焦点
name.onblur = checkName
//验证姓名
function checkName(){
//定义验证姓名的正则
let reg = /^[\u4E00-\u9FA5]{2,4}$/
// 调用验证方法
return checkInput("#nameMsg",name,reg,'姓名正确','姓名必须是2-4位汉字')
}
//年龄文本框失去焦点
age.onblur = checkAge
//验证年龄
function checkAge(){
//定义验证年龄的正则
let reg = /^\d{1,2}$|^1([0-1]\d)|20$/
// 调用验证方法
return checkInput("#ageMsg",age,reg,'年龄正确','年龄必须是0-120之间')
}
//验证方法,参数分别是:span元素Id,表单元素对象,正则规则,验证成功消息,验证失败消息
function checkInput(spanId,_this,reg,okMsg,errMsg){
// 获取消息span
let span = document.querySelector(spanId)
//获取信息
let val = _this.value
if(!reg.test(val)){
span.className="err"
span.innerHTML = errMsg
return false //验证失败返回false
}else{
span.className="ok"
span.innerHTML = okMsg
return true //验证成功返回true
}
}
</script>
</body>
</html>
实现的效果:在字符串中abcdefgname='test'sddfhskshjsfsjdfps中获取name的值test 实现的机制:通过replace的回调函数获取。可以通过下面的代码获取匹配部分
var str = "abcdefgname='test'sddfhskshjsfsjdfps"
var reg = /name='((\w|-|\s)+)/ig
str.replace(reg, function() { console.log(arguments.length)//5 console.log(arguments[1])//test })
字符串 stringObject 的 replace() 方法执行的是查找并替换的操作。它将在 stringObject 中查找与 regexp 相匹配的子字符串,然后用 replacement 来替换这些子串。如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。