咸鱼前端的正则路,不会写正则的前端不是个好博主!

子成君 489 0
深呼吸,开始[aru_43]!

“正则表达式是匹配模式,要么匹配字符,要么匹配位置。对于位置的理解,我们可以理解成空字符。”  ----摘自《JavaScript正则表达式迷你书》

注:以下全为正则使用实例,耐心阅读足以快速学习并掌握正则的书写。

代码实例大部分源自书籍:《JavaScript正则表达式迷你书》

1.字符匹配

精确匹配

var reg = /girls/
console.log(reg.test('so many girls'))
// => true

模糊匹配

1.横向模糊匹配

横向模糊指的是,一个正则可匹配的字符串的长度不是固定的,可以是多种情况的。
比如正则 /ab{2,5}c/ 表示匹配这样一个字符串:第一个字符是 "a",接下来是 2 到 5 个字符 "b",最后
是字符 "c"。

var regex = /ab{2,5}c/g;
var string =
"abc abbc abbbc abbbbc abbbbbc abbbbbbc";
console.log( string.match(regex) );
// => ["abbc", "abbbc", "abbbbc", "abbbbbc"]
小课堂

案例中用的正则是 /ab{2,5}c/g,其中 g 是正则的一个修饰符。表示全局匹配,即,在目
标字符串中按顺序找到满足匹配模式的所有子串,强调的是“所有”,而不只是“第一个”
。g 是单词 global 的首字母。

2.纵向模糊匹配

纵向模糊指的是,一个正则匹配的字符串,具体到某一位字符时,它可以不是某个确定的字符,可以有多种可能。
比如 /a[123]b/ 可以匹配如下三种字符串: "a1b"、"a2b"、"a3b"。

var regex = /a[123]b/g;
var string =
"a0b a1b a2b a3b a4b";
console.log( string.match(regex) );
// => ["a1b", "a2b", "a3b"]

2.字符组

注:需要强调的是,虽叫字符组(字符类),但只是其中一个字符。
例如 [abc],表示匹配一个字符,它可以是 "a"、"b"、"c" 之一。

范围表示法

[123456abcdefGHIJKLM],可以写成 [1-6a-fG-M]。用连字符 - 来省略和简写。

排除字符组

排除字符组(反义字符组)的概念。例如 [^abc],表示是一个除 "a"、"b"、"c"之外的任意一个字符。字符组的第一位放 ^(脱字符),表示求反的概念。
当然,也有相应的范围表示法。

常见的简写形式

字符组 具体含义
\d 表示 [0-9]。表示是一位数字。记忆方式:其英文是 digit(数字)。
\D 表示 [^0-9]。表示除数字外的任意字符。
\w 表示 [0-9a-zA-Z_]。表示数字、大小写字母和下划线。记忆方式:w 是 word 的简写,也称单词字符。
\W 表示 [^0-9a-zA-Z_]。非单词字符。
\s表示 [ \t\v\n\r\f]。表示空白符,包括空格、水平制表符、垂直制表符、换行符、回车符、换页符。记忆方式:s 是 space 的首字母,空白符的单词是 white space。
\S 表示 [^ \t\v\n\r\f]。 非空白符。
.表示 [^\n\r\u2028\u2029]。通配符,表示几乎任意字符。换行符、回车符、行分隔符和段分隔符除外。记忆方式:想想省略号 … 中的每个点,都可以理解成占位符,表示任何类似的东西。
如果要匹配任意字符怎么办?可以使用 [\d\D]、[\w\W]、[\s\S] 和 [^] 中任何的一个。

3.量词

量词也称重复。掌握 {m,n} 的准确含义后,只需要记住一些简写形式。

简写形式

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

贪婪匹配与惰性匹配

正则 /\d{2,5}/,表示数字连续出现 2 到 5 次。会匹配 2 位、3 位、4 位、5 位连续数字。

var regex = /\d{2,5}/g;
var string =
"123 1234 12345 123456";
console.log( string.match(regex) );
// => ["123", "1234", "12345", "12345"]

但是其是贪婪的,它会尽可能多的匹配。你能给我 6 个,我就要 5 个。你能给我 3 个,我就要 3 个。
反正只要在能力范围内,越多越好。

而惰性匹配,就是尽可能少的匹配:

var regex = /\d{2,5}?/g;
var string =
"123 1234 12345 123456";
console.log( string.match(regex) );
// => ["12", "12", "34", "12", "34", "12", "34", "56"]

其中 /\d{2,5}?/ 表示,虽然 2 到 5 次都行,当 2 个就够的时候,就不再往下尝试了。

通过在量词后面加个问号就能实现惰性匹配,因此所有惰性匹配情形如下:

咸鱼前端的正则路,不会写正则的前端不是个好博主!

待续....

发表评论 取消回复
OwO 图片 链接 代码

分享