正则表达式简介

2017-05-16 Lanffy 更多博文 » 博客 » GitHub »

正则

原文链接 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