正则表达式

JS 中关于正则的方法

RegExp 实例方法

  • reg.test(str):返回一个布尔值,表示当前模式是否能匹配参数字符串
  • reg.exec(str):返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串,否则返回 null

String 实例方法

  • String.match(reg):返回一个数组,成员是所有匹配的子字符串。
  • String.search(reg):按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置。
  • String.replace(reg, str):按照给定的正则表达式进行替换,返回替换后的字符串。
  • String.split(reg):按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员。

匹配字符串

两种模糊匹配

匹配方式如何匹配写法描述
横向模糊匹配量词{n,m}最少出现多少次,最多出现多少次。
纵向模糊匹配字符组[xyz]匹配 x、y、z 的任何一个

字符组

当字符组中匹配的字符串特别的情况,可以使用简写。

  • 范围表示法:[1-3] 表示从 1、2、3 匹配任意一个数组
  • 排除字符组:[^abc] 表示匹配除了 abc 之外的任意一个字符

常见的简写形式:

字符组描述
[0-9] or \d表示匹配 0-9 的一位数字
[a-z]匹配 a-z 的一个字母
[A-Z]匹配 A-Z 的一个字母
\d\D\d表示[0-9],\D表示[^0-9]。记忆:digit
\w\W\w表示[0-9a-zA-Z],\W,表示[^0-9a-za-z]。记忆:word
\s表示[ \t\v\n\r\f]。表示空白符,记忆方式:space
\S表示[^ \t\v\n\r\f]。非空白符。
.表示[^\n\r\u2028\u2029]。通配符,表示几乎任意字符。

量词

量词简写

字符组具体含义
{n,}表示至少出现 n 次
{n}等价于{n,n},表示出现 n 次
?等价于{0,1},表示出现或者不出现。
记忆方式:问号的意思表示,有吗?
+等价于{1,},表示出现至少一次。
记忆方式:加号是追加的意思,得先有一个,然后才考虑追加。
*等价于{0,},表示出现任意次,有可能不出现。
记忆方式:看看天上的星星,可能一颗没有,可能零散有几颗,可能数也数不过来。

贪婪匹配和惰性匹配

  • 惰性匹配:正则/\d{2,5}/ ,默认按照最多的匹配
"12 123 4567 12345".match(/\d{2,5}/g);
// ["12", "123", "4567", "12345"]
1
2
  • 贪婪匹配:正则/\d{2,5}?/,按照最少的匹配
"12 123 4567 12345".match(/\d{2,5}?/g);
// ["12", "12", "45", "67", "12", "34"]
1
2

多选分支

一个模式可以实现横向和纵向模糊匹配。而多选分支可以支持多个子模式任选其一。

具体形式如下:(p1|p2|p3),其中 p1、p2 和 p3 是子模式,用|(管道符)分隔,表示其中任何之一。

例如要匹配字符串"good"和"nice"可以使用/good|nice/

"good nice".match(/good|nice/g);
// ["good", "nice"]
1
2

分支结构也是惰性的,即当前面的匹配上了,后面的就不再尝试了。

案例分析