参考资料html
慕课网-鬼斧神工之正则表达式
正则表达式后向引用详解
正则表达式30分钟入门教程正则表达式
正则表达式是字符串的搜索和匹配的工具。工具
一个测试正则表达式的工具 regexpal -- 中文版测试
//
表示一个正则表达式的开始和结束网站
/0-9/
界定符就是包含正则表达式在中间的两个斜杠spa
标点.net
英文字母数字code
汉字、日文、阿拉伯文等语言文字regexp
数理化公式符号htm
其余可见字符
换行符 \n
回车 \r
制表符 \t
空格
其余不可见的符号
若是想查找元字符自己的话,就要使用 \
来取消这些字符的特殊意义
例如:\.
\*
\\
代码 / 语法 | 说明 |
---|---|
| |
匹配两个或多个分支选择 |
[] |
匹配方括号中的任意一个原子 |
[^] |
匹配除了方括号中的原子以外的任意字符 |
代码 / 语法 | 说明 |
---|---|
. |
匹配除换行符之外的任何字符 [^\n] |
\d |
匹配数字 [0-9] |
\D |
匹配非数字 [^0-9] |
\s |
匹配一个不可见原子 [\f\n\r\t\v] |
\S |
匹配一个可见原子 [^f\n\r\t\v] |
\w |
匹配字母或数字或下划线 [0-9a-zA-Z_] |
\W |
匹配非字母或数字或下划线 [^0-9a-zA-Z_] |
// 匹配一个或者更多连续的数字 var pattern = /\d+/; /* * 好比一个网站要求你填写的 QQ 号必须是 5-12 位的数字时,可使用 ^\d{5,12}$ * {5,12} 表示重复次数很多于 5 次,不能多于 12 次,不然都不匹配 * 有些正则表达式处理工具还有一个处理多行的选项,若是选中了这个选项 * ^ 和 $ 的意义就变成了匹配行的开始处和结束处 */
限定符 -- 指定数量的代码
代码 / 语法 | 说明 |
---|---|
* |
重复 0 次或更屡次 |
+ |
重复一次或更屡次 |
? |
重复 0 次或 1 次 |
{n} |
刚好重复 n 次 |
{n, } |
最少重复 n 次 |
{n, m} |
重复 n 次到 m 次 |
// 匹配恰好 6 个字符的单词 var pattern = /\bw{6}\b/;
代码 / 语法 | 说明 |
---|---|
^ |
匹配字符串开始的位置 |
$ |
匹配字符串结尾的位置 |
\b |
匹配单词的开始或结束 |
\B |
匹配非单词的开始或结束 |
// 匹配以字母 a 开头的单词 var pattern = /\ba\w*\b/; /* * 先是某个单词的开头处 \b * 而后是字母 a * 而后是任意数量的字母或数字 \w* * 最后是单词的结束处 \b */
代码 / 语法 | 说明 |
---|---|
() |
匹配其中的总体做为原子 |
重复单个字符,直接在字符后面加上限定符就好了;
若是想要重复多个字符,能够用小括号来指定 子表达式(也叫 分组),而后能够指定这个 分组的重复次数,也能够对这个 分组进行其余的一些操做。
// 这个表达式能够匹配几种格式的电话号码,像 `(010)88886666`,或 `022-22334455`,或 `02912345678` 等 var pattern = /\(?0\d{2}[) -]?\d{8}/;
首先是一个转义字符 \(
,他能出现 1 次或 0 次(?
)
而后是一个 0
,后面跟着两个数字 \d{2}
,
而后是 )
或 空格
或 -
中的一个,它出现 1 次或不出现 [) -]?
最后是 8 个数字 \d{8}
修正模式能够理解成是给正则表达式的匹配过程指定一种模式。
匹配结果怎么会有歧义呢?看看下面的代码就知道了:
var pattern = /mertens.+1994/; var str = 'mertens__199419941994199419941994';
上面那段代码就是有歧义的了,看上去能够是匹配到 mertens__199419941994199419941994
,也可能匹配到 mertens__1994
。
贪婪:匹配结果存在歧义的时候取其长
懒惰:匹配结果存在歧义的时候取其短
未经修饰的量词就是贪心量词,末尾加上?
则使量词变懒惰。
// 贪婪模式 var pattern1 = /mertens.+1994/; var str = 'mertens__199419941994199419941994'; var result1 = str.match(pattern1); console.log(result1); // mertens__199419941994199419941994 // 懒惰模式 var pattern2 = /mertens.+?1994/; var str = 'mertens__199419941994199419941994'; var result2 = str.match(pattern2); console.log(result2); // mertens__1994
分组捕获的内容能够在表达式或其余程序中做进一步的处理。
默认状况下,每一个分组会自动拥有一个组号
。
分配组号的规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为 1,第二个为 2,以此类推。
后向引用
用于重复搜索前面某个分组匹配的文本。
// \1 表示分组 1 匹配的某个文本 // 匹配连着的两个重复的单词 var pattern = /\b(w+)\b\s+\1\b/;
能够 指定子表达式的组名
// 能够指定组名为 Word // 使用这样的语法:(?<Word>\w+) // 把尖括号换成'也行:(?'Word'\w+)) // 这样就把\w+的组名指定为 Word 了 // 要反向引用这个分组捕获的内容,可使用 \k<Word> var pattern = /(?<Word>\w+) (?'Wrod'\w+)/; // 上一个例子也能够写成这样 var pattern = /\b(?<Word>\w+)\b\s+\k<Word>\b/;
使用小括号的时候,还有不少特定用途的语法:
零宽的意思是指该位置是不占宽度的,也就是只做断言判断,但不匹配实际的内容;
\d(?=\.)
这个正向先行断言就只匹配点号以前的数字
,可是它并不会匹配到这个点号
,这个\d(?=\.)
括号中的匹配内容也就是零宽了。零宽断言分为四种,分别是:
正向先行(Positive Lookahead
)
正向回顾(Positive Lookbehind
)
负向先行(Negative Lookahead
)
负向回顾(Negative Lookbehind
)
正向
和 负向
的意思是断言括号中的内容是匹配仍是不匹配
先行
与 回顾
的意思是实际匹配的内容在断言内容的前面仍是后面
直接地说“零宽正向先行断言”所匹配的就是 必须出现的断言内容的前面的内容
理解了前面这个“零宽正向先行断言”,随之而来的就比较好理解了。依照这个逻辑,零宽正向回顾断言所匹配的是必须出现的断言内容以后的内容,它的语法是:(?<=...)
好比 (?<=\.)\w
所匹配的就是点号以后的 ASCII
字符。
负向与正向意思相反, 正向是断言内容必须出现,而负向则是断言内容必须不出现。
正负向与先行回顾的概念都已在前面列出, 负向回顾的理解应该就很顺了。负向回顾的语法是:(?<!...)
。 好比 (?<!Java)Script
该正则只匹配不是 JavaScript 的 Script,它就能正确匹配 ECMAScript 和 Script。