javascript 正则修饰符/正则表达式的修饰符

JS正则表达式的修饰符

javascript的正则里,

^ 默认匹配换行符之后,

$ 默认匹配换行符之前,

用 /^.+$/ 这样就只能匹配一行了,

但是很多时候需要让^ $分别匹配整个字符串的开始和结束,

这时候就需要用到 m 这个模式修正符了!

/^.+$/m 这样就可以匹配整个字符串了!

修饰符是影响整个正则规则的特殊符号,会对匹配结果和部分内置函数行为产生不同的效果,JavaScript正则表达式(以后简称正则)中,包含以下三个修饰符:

  • i(intensity):大小写不敏感
  • g(global):全局查找,对于一些特定的函数,将迭代完整的字符串,获得所有的匹配结果,而不仅仅在得到第一个匹配后就停止进行
  • m(multiple):检测字符串中的换行符,主要是影响字符串开始标识符^和结束标识符$的使用
var s1 = 'Hello';
var s2 = 'hello';
var p1 = /Hello/;
var p2 = /Hello/i;
console.log(p1.test(s1));//true
console.log(p1.test(s2));//false
console.log(p2.test(s1));//true
console.log(p2.test(s2));//true

可以看到正则p2会忽略s2中大写的H的到匹配结果

var p1 = /hello/;
var p2 = /hello/g;
var str = 'hello world, hello world';

console.log(str.match(p1));// ["hello", index: 0, input: "hello world, hello world"]
console.log(str.match(p2));// ["hello", "hello"]

p1中未使用g修饰符,因此在匹配到第一个hello时,便停止后续匹配,提取匹配子字符串及匹配位置。而p2则会完整地匹配字符串,直至字符串结束位,并将所有结果提取出来。

var str = 'hello world,\nhello world';
var p1 = /^hello/g;
var p2 = /^hello/gm;
console.log(str.match(p1));//["hello"]
console.log(str.match(p2));//["hello", "hello"]

str中存在换行符\n。在p1p2存在字符串开始位置标识符,使用p1会对str进行整体匹配,因此只存在一个字符串开始位,和一个字符串结束位,因此只匹配到一个hello。而p2会将str根据换行符进行分割,可以理解为存在多个子串,因此存在多个字符串开始位和字符串结束位,所以会匹配到第二个hello

/g修饰符代表全局匹配,查找所有匹配而非在找到第一个匹配后停止。

var str = "123#abc";

var noglobal = /abc/i;//非全局匹配模式
console.log(re.test(str)); //输出ture
console.log(re.test(str)); //输出ture
console.log(re.test(str)); //输出ture
console.log(re.test(str)); //输出ture


var re = /abc/ig;//全局匹配
console.log(re.test(str)); //输出ture
console.log(re.test(str)); //输出false
console.log(re.test(str)); //输出ture
console.log(re.test(str)); //输出false

在创建正则表达式对象时如果使用了“g”标识符或者设置它了的?global属性值为ture时,那么新创建的正则表达式对象将使用模式对要将要匹配的字符串进行全局匹配。在全局匹配模式下可以对指定要查找的字符串执行多次匹配。每次匹配使用当前正则对象的lastIndex属性的值作为在目标字符串中开 始查找的起始位置。lastIndex属性的初始值为0,找到匹配的项后lastIndex的值被重置为匹配内容的下一个字符在字符串中的位置索引,用来标识下次执行匹配时开始查找的位置。如果找不到匹配的项lastIndex的值会被设置为0。当没有设置正则对象的全局匹配标志时lastIndex属性的值始终为0,每次执行匹配仅查找字符串中第一个匹配的项。

var regex = /abc/i;
alert(regex.test("aBc"));//true

当使用/g匹配模式的时候,我们可以通过循环,获取所有的匹配项。

var str = "012345678901234567890123456789";
var globalre = /123/g;

//循环遍历,获取所有匹配
var result = null;
while ((result = globalre.exec(str)) != null) {
console.log(result[0]);
console.log(globalre.lastIndex);
}

对于RegExp.exec方法,不加入g,则只返回第一个匹配,无论执行多少次均是如此;如果加入g,则第一次执行也返回第一个匹配,再执行返回第二个匹配,依次类推。

var str = "012345678901234567890123456789";
var re = /123/;
var globalre = /123/g;
//非全局匹配
var resultArray = re.exec(str);
console.log(resultArray[0]);//输出123
console.log(resultArray.index);//输出1
console.log(globalre.lastIndex);//输出0
var resultArray = re.exec(str);
console.log(resultArray[0]);//输出123
console.log(resultArray.index);//输出1
console.log(globalre.lastIndex);//输出0
//全局匹配
var resultArray = globalre.exec(str);
console.log(resultArray[0]);//输出123
console.log(resultArray.index);//输出1
console.log(globalre.lastIndex);//输出4
var resultArray = globalre.exec(str);
console.log(resultArray[0]);//输出123
console.log(resultArray.index);//输出11
console.log(globalre.lastIndex);//输出14

~~~

未经允许不得转载:WEB前端开发 » javascript 正则修饰符/正则表达式的修饰符

赞 (0)