JS中正则表达式

Posted 提升自己,才有选择的能力和勇气

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS中正则表达式相关的知识,希望对你有一定的参考价值。

正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。简单来说正则表达式就是处理字符串的,我们可以用它来处理一些复杂的字符串。

创建方式

var reg = new RegExp(pattern,modifiers);  //构造函数创建方式,pattern 和 modifiers 均为字符串,
var reg = /pattern/modifiers;    // 字面量创建方式

pattern(模式):描述了表达式的模式

modifiers(修饰符) :用于指定不区分大小写、全局匹配和多行匹配(i、g、m),当没有时默认为区分大小写只匹配第一个

字面量创建方式和构造函数创建方式的区别

1、字面量创建方式不能进行字符串拼接,实例创建方式可以

 

var regParam = ‘cm‘;
var reg1 = new RegExp(regParam+‘1‘);
var reg2 = /regParam/;
console.log(reg1);  //   /cm1/
console.log(reg2);  //  /regParam/

2、字面量创建方式特殊含义的字符不需要转义,实例创建方式需要转义

var reg1 = new RegExp(‘d‘);   //    /d/ 
var reg2 = new RegExp(‘\d‘)  //   /d/
var reg3 = /d/;              //  /d/

 

修饰符

i:不区分大小写

var str = "Visit RUnoob";
var patt1 = /runoob/;
var patt2 = /runoob/i;
console.log(patt1.test(str))   //false
console.log(patt2.test(str))   //true

g:全局匹配,(即查找所有匹配而非在找到第一个匹配后停止)

var str="Is this all there is?";
var patt1=/is/g;
console.log( str.match(patt1) );   // ["is", "is"]

m:执行多行匹配。多行匹配在需要匹配的字符串里有换行符时凸显出它的意义。如果没有用多行匹配,那么不管多少换行符,该字符串就只视为一行,只有一对头和尾。如果使用了多行匹配,那么每一行就都有一对头和尾,使用 ^ 和 $ 进行匹配时结果就不一样。

var str="This an 
 good"; 
var reg=/an$/;
var reg2=/an$/m;
console.log( reg.test(str) );     //false
console.log( reg2.test(str) );   //true

var str2="This an 
 good an"; 
var reg3 = /an$/mg;
console.log( str2.match(reg3) );     // ["an", "an"]

 

元字符:  http://www.runoob.com/jsref/jsref-obj-regexp.html

d : 0-9之间的任意一个数字  d只占一个位置
w : 数字,字母 ,下划线 0-9 a-z A-Z _
s : 空格或者空白等
D : 除了d
W : 除了w
S : 除了s
 . : 除了
之外的任意一个字符
  : 转义字符
 | : 或者
() : 分组

 : 匹配换行符
 : 匹配边界 字符串的开头和结尾 空格的两边都是边界 => 不占用字符串位数
 ^ : 限定开始位置 => 本身不占位置
 $ : 限定结束位置 => 本身不占位置
[a-z] : 任意字母 []中的表示任意一个都可以
[^a-z] : 非字母 []中^代表除了
[abc] : abc三个字母中的任何一个 [^abc]除了这三个字母中的任何一个字符

代表次数的量词元字符

* : 0到多个
+ : 1到多个
? : 0次或1次 可有可无
{n} : 正好n次;
{n,} : n到多次
{n,m} : n次到m次

 

 

正则表达式对象(RegExp)的方法

exec:返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

reg.exec() 方法比较复杂,全局匹配和不全局匹配结果不一样,当用到分组时结果又不一样。

var str = ‘abc123cba456aaa789‘;
var reg = /d+/;
console.log( reg.exec(str) )  //["123", index: 3, input: "abc123cba456aaa789"];
console.log(reg.lastIndex)  //0 

// [ "123",index:3,input:"abc123cba456aaa789" ] 中,
// "123" 表示我们捕获到的字符串
// index:3 表示捕获到的字符串的起始位置
// input 表示原有的字符串

当我们用exec进行捕获时,如果正则没有加 ‘g‘ 标识符,则exec捕获的每次结果都是同一个,当正则中有 ‘g‘ 标识符时捕获的结果就不一样了,再来看刚刚的例子

var str = ‘abc123cba456aaa789‘;
var reg = /d+/g; //此时加了标识符g
console.log(reg.lastIndex)  // lastIndex : 0 

console.log(reg.exec(str))  //  ["123", index: 3, input: "abc123cba456aaa789"]
console.log(reg.lastIndex)  // lastIndex : 6

console.log(reg.exec(str))  // ["456", index: 9, input: "abc123cba456aaa789"]
console.log(reg.lastIndex)  // lastIndex : 12

console.log(reg.exec(str))  // ["789", index: 15, input: "abc123cba456aaa789"]
console.log(reg.lastIndex)  // lastIndex : 18

console.log(reg.exec(str))  // null
console.log(reg.lastIndex)  // lastIndex : 0

// 每次调用exec方法时, 捕获到的字符串都不相同
// lastIndex: 这个属性记录的就是下一次捕获从哪个索引开始,当未开始捕获时,这个值为0。 
// 如果当前次捕获结果为null。 那么lastIndex的值会被修改为0.下次从头开始捕获。
// 而且这个lastIndex属性还支持人为赋值。

exec的捕获还受分组()的影响

let str = ‘aaabbb‘;
let reg = /(a+)(b+)/;
let reg2 = /(a+)(?:b+)/;

console.log( reg.exec(str) );    //["aaabbb", "aaa", "bbb", index: 0, input: "aaabbb", groups: undefined]
console.log( reg2.exec(str) );  //["aaabbb", "aaa", index: 0, input: "aaabbb", groups: undefined]

//exec执行匹配的时候, 会先返回整体匹配值, 再分别返回按照正则表达式中由括号扩起来的小分组进行匹配的值。?: 可以取消返回该分组的匹配值。

 

以上是关于JS中正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

text 正则表达式片段

markdown 正则表达式模式片段

循环通过 python 正则表达式匹配

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

js 正则验证正整数

js验证只能输入字母,数字或字母数字组合正则表达式