正则表达式

正则表达式 (Regular Expression) 对字符串的匹配很强大也很方便,因此做一些记录。

特殊字符

特殊字符 描述 备注
. 匹配一个除换行符之外的任意字符。
\d 匹配一个数字。等价于 [0-9]。
\D 匹配一个非数字。等价于 [^0-9]。
\w 匹配一个字母或数字或下划线。 \w 匹配的字母不止英文字母,因此比 [A-Za-z0-9_] 范围更广。
\W 匹配一个非字母或数字或下划线。
\s 匹配一个任意空白字符,包括空格、制表符、换页符等。等价于 [ \f\n\r\t\v]。
\S 匹配一个任意非空白字符。等价于 [^ \f\n\r\t\v]。
^ 匹配行的开头。 如 ^\d 表示匹配以数字开头的行。
$ 匹配行的结尾。 如 \d$ 表示匹配以数字结尾的行。
* 匹配前面的子表达式零次或多次。 如 abc* 能匹配 ab 、 abc 或 abcc 等。
+ 匹配前面的子表达式一次或多次。 如 abc+ 能匹配 abc 或 abcc 等,但不能匹配 ab。
? 匹配前面的子表达式零次或一次。 如 abc? 能匹配 ab 或 abc。
{n} 匹配前面的子表达式 n 次。 如 [A-Z]{5} 能匹配 5 个连续的大写字母。
{n,} 匹配前面的子表达式至少 n 次。 如 [a-z]{3,} 能匹配至少 3 个连续的小写字母。
{n,m} 匹配前面的子表达式 n-m 次。 如 \d{4,6} 能匹配 4-6 个连续的数字。
(XYZ) 将() 中的内容视为一个整体。 如 p(abc)+ 将匹配 pabc 或 pabcabc 等。
[XYZ] 将[] 中为一个集合,匹配该集合中的任意一个字符。 可用 - 表示范围,如 [A-Za-z0-9] 能匹配任意大小写英文字母和数字一次。
[^XYZ] 负值集合,匹配非该集合中的任意一个字符。
X|Y 匹配 X 或 Y。
\b 匹配一个单词边界,即单词和空格间的位置。 如 \ber 可以匹配 erase,但不能匹配 verb 或 server。
\B 匹配一个非单词边界。
\< \> 匹配单词的开始 (\<) 和结尾 (\>) 如 ion\> 可以匹配 onion,但不能匹配 sionox 或 ionic。

因此需要使用 \ 转义的字符有 \ | \ [ ] { } ( ) ? + . * ^ $

贪婪匹配

正则默认是进行贪婪匹配,意思是会匹配最长的符合条件的子串。
如在匹配注释时使用:/\*.*\*/ 可匹配 C 语言中 /*xxxxxxxxx*/ 的块注释。
但如果有以下内容:
/*aaaaaaaaaaa*/ xxxxxxx /*bbbbbbbbbbbbbbb*/ yyyyyyy /*ccccccccc*/
使用 /\*.*\*/ 会全部匹配,但如果在 *+ 等通配符后加一个 ?,则会进行最短匹配。
/\*.*?\*/ 可匹配 /*aaaaaaaaaaa*//*bbbbbbbbbbbbbbb*//*ccccccccc*/