Fork me on GitHub

正则表达式笔记一

心血來潮,又挖出正則表達式,順便整理下筆記。

元字符

常用的元字符:

语法 说明
\b 匹配字边界
\B 匹配非字边界
\d 匹配数字字符
\D 匹配非数字字符
\w 匹配A-Z,a-z,0-9和下划线
\W 匹配除以上任意

特殊字符

特殊字符的匹配需要进行转义,字符前添加 “\”

语法 说明
*
零次或多次匹配前面的字符或表达式
+
一次或多次匹配前面的字符或表达式
?
零次或一次匹配。若紧随其他限定符则匹配非贪婪模式
^
匹配字符串开始的位置。若用作括号表达式第一个字符贼会对字符集取反
$
匹配搜索字符串结尾的位置
.
匹配除换行符 \n 之外的任意单个字符
[ ]
标记括号表达式的开始和结尾
{ }
限定表达式的开始和结尾
( )
子表达式的开始和结尾。可保存子表达式以备将来使用
|
候选项表达式匹配
/
JScript 中的文本正则表达式模式的开始和结尾,后一个 ‘/‘ 后添加单字符标志可指定搜索行为。g(全局) i(忽略大小写)
\
将下一字符标记为特殊字符文本。反向引用或八进制转义字符

非打印字符

语法 说明
\f 换页符
\n 换行符
\r 回车符
\v 垂直制表符
\t Tab
\s 任意空白字符
\S 任意非空白字符

贪婪与懒惰模式

正则中包含能接受的重复的限定符时,通常行为是尽可能匹配更多的字符。

例如: a.*b 限定符在贪婪模式下会尽可能匹配更多的字符。
a.*b 会匹配字符串 acbabacbab 而不会匹配 acb

有时我们需要匹配尽可能少的字符,这时我们需要在限定符后添加 ?
例如:a.*?b 会匹配到 acbabacbab

懒惰限定符:

语法 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

反向引用

子表达式匹配的文本即此分组捕获的内容能在表达式以及程序中作进一步的处理。

子表达式用括号限定符来声明。 (a.b)c(a.b) 则声明了一个子表达式,子表达式的内容可以捕获。而子表达式匹配的内容则可视作一个分组。

默认情况下,每个分组都拥有一个组号,从左到右,以子表达式的左括号为标志,第一组为1,依次递增。

反向引用用于重复搜索前面某个分组匹配的文本,语法为: +组号或组名 “\1”

例如:搜索不正确的变量声明 var var a = ‘hello’;

\b(\w+)\b\s+\1\b 为例,(\w+) 分组匹配内容, \1 分组捕获内容。

或者可以自己指定组名 语法: (?<name>\w+)(?’name’\w+) name 即为组名称。

反向引用这个组捕获内容,语法: \k<name>

所以上面的例子也可以写作: \b(?\w+)\b\s+\k\b

其次还有几种特殊用法:

分类 代码/语法 说明
内容捕获
(exp)
匹配exp并捕获到自动命名的组中
内容捕获
(?exp)
匹配exp并捕获到name命名的组中
内容捕获
(?:exp)
匹配exp不捕获也不分配组
零宽断言
(?=exp)
匹配exp前面位置
零宽断言
(?<=exp)
匹配exp后面位置
零宽断言
(?!exp)
匹配后面不是exp的位置
零宽断言
(?<!exp)
匹配钱面不是exp的位置
注释
(?#comment)
提供注释,方便阅读

零宽断言

用于查找某些内容(但不包括自身)之前或者之后的东西,也就是说他们指定一个位置,而这个位置满足一定的条件(即断言),故称为零宽断言。

  • (?=exp) 零宽度正预测先行断言

    断言自身出现的位置的后面能匹配表达式exp

    例如: \b\w+(?=img\b) 匹配以img结尾的单词的前面部分(不包括 img )

  • (?<=exp) 零宽度正回顾后发断言

    断言自身出现的位置的前面能匹配表达式exp

    (?<=\bexp)\w+\b 匹配 exp 开头的单词的后半部分(不包括 exp )

  • (?:exp) 零宽度负预测先行断言

    断言此位置的后面不能匹配表达式 exp

    \d{3}(?:\d) 匹配后面不为数字的三位数

  • (?<:exp) 零宽度负回顾后发断言

    断言此位置出现的前面不能匹配子表达式 exp

    (?<:0)\d{7} 匹配前面非 0 的 7 位数字

注释

通过 (?#comment) 来包含注释,方便阅读。

优先级

正则表达式的匹配优先级:从左到右,并遵循优先级顺序。
从上到下优先级依次降低。

代码 说明
\
转义符
() (?:) (?=) []
括号,中括号
* + ? {n} {n,} {n,m}
限定符
^ $ \任意字符
定位点和序列
|
替换选项
显示 Gitment 评论