正则表达式基础语法笔记
这是在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 处停止。
高级正则表达式技巧
等待后续更新
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Drenj7's blog!
评论