ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

理顺 JavaScript (19) - 正则表达式对象 RegExp

2021-04-29 21:55:11  阅读:197  来源: 互联网

标签:arr abc 匹配 exec 19 JavaScript alert str RegExp


   理顺 JavaScript (19) - 正则表达式对象 RegExp    


建立正则表达式的方法


var p1 = new RegExp("abc", "igm");
var p2 = RegExp("abc", "igm");
var p3 = /abc/igm;

//判断是否是正则表达式对象
alert(p1 instanceof RegExp); //true
alert(p2 instanceof RegExp); //true
alert(p3 instanceof RegExp); //true


正则表达式对象的 5 个属性


var p = /abc/igm;

//source: 表达式文本, 只读
alert(p.source);     //abc

//ignoreCase: 是否有指定 i, 只读; i 表示不不区分大小写
alert(p.ignoreCase); //true

//global: 是否有指定 g, 只读; g 表示匹配全部
alert(p.global);     //true

//multiline: 是否有指定 m, 只读; m 表示多行匹配
alert(p.multiline);  //true

//lastIndex: 最好一次的匹配位置, 是可读写属性.
alert(p.lastIndex);  //0; 在匹配之前它肯定是 0


正则表达式对象的 2 个方法之 test


//这个 test 非常简单, 它只能返回 true/false 表示是否找到匹配; 通过它了解不到更多信息
var str, p, b;
str = '1:abc;2:Abc;3:aBc;4:abC;5:ABc;6:aBC;7:AbC;8:ABC';

p = /abc/i;
b = p.test(str);
alert(b); //true; 表示有匹配到

p = /abcdefg/i;
b = p.test(str);
alert(b); //false; 表示没匹配到

//对 test 来讲, 是否指定 g(全局匹配) 是没有意义的; 因为它有发现就返回.


正则表达式对象的 2 个方法之 exec


//exec 返回的是匹配结果, 是个数组
var str, p, arr;
str = '1:abc;2:Abc;3:aBc;4:abC;5:ABc;6:aBC;7:AbC;8:ABC';

p = /abc/i;
arr = p.exec(str);
alert(arr); //abc

//怎么能知道返回的 arr 是个数组, 测试一下:
alert(arr instanceof Array); //true
alert(arr[0]);               //abc

//何必要用数组表达? 因为正则表达式中可能会有"子表达式", 譬如:
p = /(ab)(c)/i; 

//子表达式是用 () 区分的, 上面表达式包含两个子表达式; 用于 exec 函数时将返回 length = 3 的数组:
//arr[0]: 匹配整个表达式的结果;
//arr[1]: 匹配第一个子表达式的结果;
//arr[2]: 匹配第二个子表达式的结果...

//包含子表达式的例子(继续使用上面的字符串 str)
p = /(ab)(c)/i;
arr = p.exec(str);
alert(arr);      //abc,ab,c

//遍历这个数组
for (var i=0; i < arr.length; i++) {
  alert(arr[i]); //abc / ab / c
}

//这个返回的数组还有两个属性: index(匹配到的内容在字符串中的位置)、input(原始字符串)
alert(arr.index); //2; 因为是 0 起, 也就是 3
alert(arr.input); //1:abc;2:Abc;3:aBc;4:abC;5:ABc;6:aBC;7:AbC;8:ABC

//如果找不到, exec 会返回 null; 这对继续探讨很有用
p = /abcde/i;
alert(p.exec(str)); //null


关于 exec 的全局匹配


//首先, exec 不会像 String.match 那样方便的完成全局匹配; 不过这恰是它的强大之处.

//第一个例子没有指定 g; 执行了三次 exec 结果都是一样的
var str, p1, arr;
str = '1:abc;2:Abc;3:aBc;4:abC;5:ABc;6:aBC;7:AbC;8:ABC';
p1 = /(ab)(c)/i;
arr = p1.exec(str);
alert(arr); //abc,ab,c
arr = p1.exec(str);
alert(arr); //abc,ab,c
arr = p1.exec(str);
alert(arr); //abc,ab,c

alert(p1.lastIndex); //5


//这个例子使用了全局匹配, 结果不一样了; 
var str, p2, arr;
str = '1:abc;2:Abc;3:aBc;4:abC;5:ABc;6:aBC;7:AbC;8:ABC';
p2 = /(ab)(c)/ig;
arr = p2.exec(str);
alert(arr); //abc,ab,c
arr = p2.exec(str);
alert(arr); //Abc,Ab,c
arr = p2.exec(str);
alert(arr); //aBc,aB,c

alert(p2.lastIndex); //17

//可以这样遍历所有匹配:
var str, p, arr;
str = '1:abc;2:Abc;3:aBc;4:abC;5:ABc;6:aBC;7:AbC;8:ABC';
p = /(ab)(c)/ig;
while ((arr = p.exec(str)) != null) {
  alert(arr); //可在此提取子表达式的匹配结果, 这个功能只有 exec 可以.
}



标签:arr,abc,匹配,exec,19,JavaScript,alert,str,RegExp
来源: https://blog.51cto.com/u_14617575/2743744

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有