正则表达式简介
原文链接 https://lanffy.github.io/2017/05/16/Introduction-To-Regular-expression
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
元字符
元字符安(Meta-Characters)是正则表达式中具有特殊意义的专用字符,常用的元字符如下表:
元字符 | 含义 |
---|---|
. | 匹配除换行符的任意字符 |
\w | 匹配字母或数据或下划线或汉字 |
\s | 匹配任意空白字符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
- | 表示范围 |
[] | 匹配括号中的任意一个字符 |
* | 量词,表示重复零次或多次 |
+ | 量词,表示重复一次或多次 |
? | 量词,表示出现一次或零次 |
{n} | 量词,表示重复n次 |
{n,} | 量词,表示重复n次或n次以上 |
{n,m} | 量词,表示重复n到m次 |
反义
查询与元字符相反的字符,常用反义如下表:
反义字符 | 含义 |
---|---|
\W | 匹配任意非字母、数字、下划线、汉字的字符 |
\S | 匹配任意非空白字符 |
\D | 匹配任意非数字字符 |
\B | 匹配不是单词开始或结束的位置 |
[^xyz] | 匹配除了x、y、z以外的字符 |
分支
分支就是逻辑上的或关系,即c[a|u]t
可以匹配cat或者cut,[a|u]
和(a|u)
是等效的,唯一的区别在于后者会捕获匹配到的文本。
分组
常用分组语法:
分组类别 | 表达式 | 含义 |
---|---|---|
捕获 | (exp) | 匹配exp并捕获文本到自动命名的组中 |
捕获 | (?exp)或(?'name'exp) | 匹配exp并捕获文本到名称为name组中 |
捕获 | (?:exp) | 匹配exp,但不捕获文本,也不给该括号分配组号 |
零宽断言 | (?=exp) | 匹配exp前面的位置 |
零宽断言 | (?<=exp) | 匹配exp后面的位置 |
零宽断言 | (?!exp) | 匹配后面跟的不是exp的位置 |
零宽断言 | (?<!exp) | 匹配前面不是exp的位置 |
注释 | (!#comment) | 辅助阅读,不影响正则匹配 |
断言匹配的是一个 事实,而不是内容,即不会捕获内容。
反向引用
反向引用就是在表达式的后面使用表达式前面匹配到的内容。
如: \b(\w+)\b\s+\1\b
可以匹配文本 aaa bbb bbb
中的 bbb bbb
。
贪婪和懒惰匹配模式
贪婪模式
默认情况下,正则会使用贪婪模式进行匹配,即尽可能多的匹配满足条件的文本。
如: a.*b
匹配文本: aaa bbb bbb
的结果是: aaa bbb bbb
。注意最后的空格没有匹配
懒惰模式
匹配尽可能少的字符就是懒惰匹配模式。正则语法如下:
如: a.*?b
匹配文本: aaa bbb bbb
的结果是: aaa b
。