本文参考自 JavaScript正则迷你书-老姚
在学习这本书时所做的笔记
正则表达式字符匹配
正则表达式是匹配模式,要么匹配字符,要么匹配位置
匹配字符
两种模糊匹配
- 横向模糊匹配:一个正则可匹配的字符串的长度不是固定的,可以是多种情况的 如:
var regex = /ab{2,5}c/g;
var string = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";
console.log(regex.test('abbc'));
console.log(string.match(regex));
// true
// [ 'abbc', 'abbbc', 'abbbbc', 'abbbbbc' ]
{m,n},表示连续出现最少 m 次,最多 n 次。
g 是正则的一个修饰符,表示全局匹配,即,在目 标字符串中按顺序找到满足匹配模式的所有子串,强调的是“所有”,g 是单词 global 的首字母。
2. 纵向模糊匹配: 一个正则匹配的字符串,他可以不是某个确定的字符,可以有多种可能
如:/a[123]b/
可以匹配的字符串:"a1b"
、"a2b"
、"a3b"
。(one of)
字符组 []
虽叫字符组,但只是其中一个字符,如 [abc],表示匹配一个字符,它可以是 "a"、"b"、"c" 之一。
- 排除字符组(反义字符组): ^,如:某位字符可以是任何东西,但就不能是 "a"、"b"、"c", 则用[^abc]表示。
- 字符组简写形式:
字符组 | 具体含义 |
---|---|
\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] 和 [^] 中任何的一个。
量词(重复)
量词 | 具体含义 |
---|---|
{m,} | 表示至少出现 m 次。 |
{m} | 等价于 {m,m},表示出现 m 次。 |
? | 等价于 {0,1},表示出现或者不出现。记忆方式:问号的意思表示,有吗? |
+ | 等价于 {1,},表示出现至少一次。记忆方式:加号是追加的意思,得先有一个,然后才考虑追加。 |
* | 等价于 {0,},表示出现任意次,有可能不出现。记忆方式:看看天上的星星,可能一颗没有,可能零散有几颗,可能数也数不过来 |
- 贪婪匹配:会尽可能多的匹配。你能给我 6 个,我就要 5 个。你能给我 3 个,我就要 3个。反正只要在能力范围内,越多越好。 如:
var regex = /\d{2,5}/g;
var string = "123 1234 12345 123456";
console.log( string.match(regex) );
// => ["123", "1234", "12345", "12345"]
- 惰性匹配:尽可能少的匹配(量词后面加?,问一问你知足了吗?你很贪婪吗) 如:
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 个就够的时候,就不再往下尝试了。
惰性量词 | 贪婪量词 |
---|---|
{m,n}? | {m,n} |
{m,}? | {m,} |
?? | ? |
+? | + |
*? | * |
多选分支
具体形式如下:(p1|p2|p3),其中 p1、p2 和 p3 是子模式,用 |(管道符)分隔,表示其中任何之一。
分支结构也是惰性的,即当前面的匹配上了,后面的就不再尝试了。
位置匹配(共有6个)
- ^ 与 $ :匹配开头与结尾 如: 多行匹配(即有修饰符m):
var result = "I\nlove\njavascript".replace(/^|$/gm, '#');
console.log(result);
/*
#I#
#love#
#javascript#
*/
- \b 与 \B : \b 是单次边界,具体就是 \w 与 \W 之间的位置,也包括 \w与^之间的位置,和 \w 与 $ 之间的位置。 如:
var result = "[JS] Lesson_01.mp4".replace(/\b/g, '#');
console.log(result);
// => "[#JS#] #Lesson_01#.#mp4#"
- (?=p) 和 (?!p)
(?=p),其中 p 是一个子模式,即 p 前面的位置,或者说,该位置后面的字符要匹配 p。
比如 (?=l),表示 "l" 字符前面的位置,例如:
var result = "hello".replace(/(?=l)/g, '#');
console.log(result);
// => "he#l#lo"
而 (?!p) 就是 (?=p) 的反面意思,比如:
var result = "hello".replace(/(?!l)/g, '#');
console.log(result);
// => "#h#ell#o#
括号的作用
分组
/a+/匹配所有出现的a,但是要匹配所有出现的ab,需要使用/(ab)+/
var regex = /(ab)+/g;
var string = "ababa abbb ababab";
console.log( string.match(regex) );
// => ["abab", "ab", "ababab"]
分支结构
(p1|p2)分支表达式的所有可能。如要匹配:
I love JavaScript
I love Regular Expression
使用:
var regex = /^I love (JavaScript|Regular Expression)$/;
console.log( regex.test("I love JavaScript") );
console.log( regex.test("I love Regular Expression") );
// => true
// => true
未完待续...