这是在regexlearn上学习后所做的记录,这里暂时只记录基础的语法,方便以后查阅。高级的语法也是基础语法的组合,这里也不会过多的赘述,后面如果有看到比较巧妙地高级组合,也会继续扩充。

问题背景

正则表达式的使用场景还是非常广泛的,对于我个人来说在vscode中的单文件搜索与整个项目搜索可能是我正则表达式使用最为频繁的场合。简单的单词字母匹配很多时候无法满足需求,而vscode的搜索也支持通过正则表达式进行匹配,之前没有系统学习过,也没必要,看过一遍有一个印象即可。

正则匹配语法

基础匹配

将想要查找的目标单词直接输入即可,例如想要查找hello,则直接输入hello即可。

正则符号语义

内容符号

匹配长度都为1

符号样式 符号含义 符号使用示例
. 匹配任意字符,匹配长度为1 h.llo可以匹配hello
[abc] 字符集,匹配方括号中的任意字符,匹配长度为1 h[ae]llo可以匹配hello或者hallo
[^abc] 否定字符集,匹配除了方括号中的任意字符,匹配长度为1 h[^ae]llo可以匹配hillo或者hbllo
[a-z] 字符范围,匹配指定范围内的任意字符,匹配长度为1 h[a-z]llo可以匹配hallo或者hbllo
[0-9] 匹配方括号中的任意数字 h[0-9]llo可以匹配h1llo或者h2llo
[^0-9] 匹配除了方括号中的任意一个数字 h[^0-9]llo可以匹配hello或者hbllo
\w 匹配字母或数字或下划线或汉字 h\wllo可以匹配h1llo或者h_llo或者h汉llo
\W 匹配任意不是字母或数字或下划线或汉字的字符 h\Wllo可以匹配h*llo或者h#llo
\s 匹配任意空白字符,包括空格、制表符、换页符等 h\sllo可以匹配h llo或者h llo
\S 匹配任意非空白字符 h\Sllo可以匹配h*llo或者h#llo
\d 匹配任意数字 h\dllo可以匹配h1llo或者h2llo
\D 匹配任意非数字 h\Dllo可以匹配hello或者hbllo
[\u4e00-\u9fa5] 匹配中文字符 h[\u4e00-\u9fa5]llo可以匹配h汉llo

重复符号

符号样式 符号含义 符号使用示例
* 匹配前面的子表达式零次或多次 ab*c可以匹配ac或者abc或者abbc
+ 匹配前面的子表达式一次或多次 ab+c可以匹配abc或者abbc
? 匹配前面的子表达式零次或一次 ab?c可以匹配ac或者abc
{n} 匹配前面的子表达式n次 ab{2}c可以匹配abbc
{n,} 匹配前面的子表达式至少n次 ab{2,}c可以匹配abbc或者abbbc
{n,m} 匹配前面的子表达式至少n次,至多m次 ab{2,3}c可以匹配abbc或者abbbc

位置符号

符号样式 符号含义 符号使用示例
^ 匹配输入字符串的开始位置 ^hello可以匹配hello world中的hello
$ 匹配输入字符串的结束位置 hello$可以匹配hello world中的hello
\b 匹配一个单词边界,即字与空格间的位置 \bhello\b可以匹配hello world中的hello
\B 匹配非单词边界 \Bhello\B可以匹配hello world中的hello

逻辑符号

符号样式 符号含义 符号使用示例
() 分组,标记一个子表达式的开始和结束位置 (hello){2}可以匹配hellohello
\1 \2 引用组,匹配第一个或第二个括号内匹配的内容 (ha)-\1,(haa)-\2可以匹配ha-ha,haa-haa
(?: ) 非捕获分组,匹配但不捕获 (?:ha)-ha,(haa)-\1可以匹配ha-ha,haa-haa
| 或,匹配左右任意一个表达式 hello|world可以匹配hello或者world
\ 转义符,将符号转义为普通字符 \*可以匹配*

零宽断言

符号样式 符号含义 符号使用示例
(?=) 零宽度正预测先行断言,匹配一个位置,该位置后面能匹配表达式exp hello(?=world)可以匹配helloworld中的hello
(?!) 零宽度负预测先行断言,匹配一个位置,该位置后面不能匹配表达式exp hello(?!world)可以匹配hello或者hello world中的hello
(?<=) 零宽度正回顾后发断言,匹配一个位置,该位置前面能匹配表达式exp (?<=hello)world可以匹配helloworld中的world
(?<!) 零宽度负回顾后发断言,匹配一个位置,该位置前面不能匹配表达式exp (?<!hello)world可以匹配world或者helloworld中的world

特殊符号

符号样式 符号含义 符号使用示例
(?#) 注释,不影响正则表达式的匹配结果 hello(?#world)可以匹配helloworld中的hello

匹配模式

正则表达式默认执行贪婪匹配,匹配的内容尽可能长

  • 贪婪匹配:对”ber beer beeer beeeer”使用 .*r 进行匹配,它匹配任何以 r 结尾的字符串,以及前面带有该字符串的文本,但它不会在第一个 r 处停止匹配。
  • 懒惰匹配:对”ber beer beeer beeeer”使用 .*?r 进行匹配,它在 * 之后添加 ?,将查找以 r 结尾且前面带有任意字符的第一个匹配项。这意味着本次匹配将会在第一个字母 r 处停止。

高级正则表达式技巧

等待后续更新