正则表达式
简介
正则表达式 (regular expressions) 是一个非常有用的工具,可以从诸如代码、日志文件、电子表格或文档等文本中提取信息。虽然规范的语言背后有许多理论,但后续的课程和例子将探索正则表达式的更实际的用法,以便您能够尽快使用这个工具。
在使用正则表达式时要认识到的第一件事是:所有东西本质上都是字符,我们正在编写模式 (pattern) 来匹配特定的字符序列(也称为字符串)。大多数模式使用普通的 ASCII 字符,包括字母、数字、标点符号和键盘上的其他符号,如 %#$@!,但是也可以使用 unicode 字符来匹配任何类型的国际文本。
基础语法
举例 | 说明 | |
---|---|---|
abc |
匹配拥有abc 的字符串 |
|
\d |
匹配从 0 到 9 的任意数字 | |
\w |
字母数字 (alphanumeric) 元字符,匹配英文文本中的字符,相当于字符范围 [A-Za-z0-9_] |
|
\s |
可以匹配空格 (␣)、制表符 (\t)、换行 (\n) 和回车 (\r)等任意空白符(利用\s+ 可以匹配连续空格) |
|
\b |
匹配单词和非单词字符之间的边界。在捕获整个单词时最有用,例如模式 \w+\b |
|
. |
通配符,可以匹配任意单个字符 (字母、数字、空格等等) | |
[abc] |
[] 表示只匹配括号内的指定字符,在这里是只匹配单个字母 a、b 或者 c |
|
[^abc] |
使用[] 和 ^ (hat) 组成的表达式来排除特定字符。在这里表示将匹配除了字母 a、b 或 c 以外的任意单个字符 |
|
[^n-p] |
- 表示匹配到连续范围内的字符,这里表示匹配字母 n 到 p 以外的任何单个字符 |
|
a{1,3} |
{} 表示法指定每个字符的重复次数,匹配字符 a 至多 3 次,至少 1 次。ps:{n,} 表示重复至少 n 次,至多无限制 |
|
a+ |
+ 克莱尼加号 (Kleene Plus)表示1 个或更多个它所跟随的字符,这里表示至少一个a |
|
a* |
* 克莱尼星号 (Kleene Star) 表示0个或更多个它所跟随的字符,这里表示任意个a |
|
ab?c |
? 表示可选字符,这里可以匹配字符串 “abc” 或 “ac”,因为 b 被认为是可选的 |
|
^Mission: successful$ |
^ (hat) 和 $ (美元符号) 来描述一行的开始和结束,这里只匹配以 “Mission” 开头并以 “successful” 结尾的完整字符串 |
|
^(file_.*)\.pdf$ |
通过定义字符组 (groups of characters) 和() ,一对括号内的任何子模式 (subpattern) 都将被捕获 (capture) 为一个组 (group),这里匹配了所有file_ 开头,.pdf 结尾的字符串,都是只捕获了文件名到字符组,没有捕获.pdf |
|
^(IMG(\d+))\.png$ |
嵌套组,这里捕获了文件名和日期((假设是IMG20230305.png ,组1IMG20230305 ,组2则是20220305 ) |
|
`(cats | dogs)` | 条件模式 cats 或者dogs |
\D |
表示任何非数字字符 | |
\W |
表示任何非空白字符 | |
\S |
表示任何非字母或数字字符 |
进阶
语法 | 作用 | 名称 | |
---|---|---|---|
\0 、\1 、\2 …. |
0 表示整个模式匹配到的文本,\1 表示捕获的第一个组、\2 表示捕获的第二个组以此类推。 |
反向引用 back referencing)或者回溯引用 | |
(?=exp) |
指定后缀 | 零宽度正预测先行断言 zero-width positive lookahead assertion | |
(?<=exp) |
指定前缀 | 零宽度正回顾后发断言 zero-width positive lookbehind assertion | |
(?!exp) |
指定后缀不能是 | 零宽度负预测先行断言 zero-width negative lookahead assertion | |
(?<!exp) |
指定前缀不能是 | 零宽度负回顾后发断言 zero-width negative lookbehind assertion | |
`(?:cats | dogs`) | 捕获组的基础上,在左括号的右侧加上 ?: ,不捕获组 |
非捕获组(non-capturing groups) |
*? |
重复任意次,但尽可能少重复 | 非贪婪匹配,或者称为懒惰匹配 | |
+? |
重复 1 次或更多次,但尽可能少重复 | 非贪婪匹配,或者称为懒惰匹配 | |
?? |
重复 0 次或 1 次,但尽可能少重复 | 非贪婪匹配,或者称为懒惰匹配 | |
{n,m}? |
重复 n 到 m 次,但尽可能少重复 | 非贪婪匹配,或者称为懒惰匹配 | |
{n,}? |
重复 n 次或更多次,但尽可能少重复 | 非贪婪匹配,或者称为懒惰匹配 |
参考链接
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Gallifrey的计算机学习日记!
评论