简介:
A regular expression is a pattern that the regular expression engine attempts to match in input text @MSDN
通俗的讲,正则表达式就是指符合一定规则的表达式(字符串),用于文本匹配的工具。
一般有两个用途。验证和搜索(替换)。
正则表达式引擎有多种不同的形式。但是大体一样。
元字符:
^ $ \b 匹配位置
. 匹配除了换行符以外的所有字符
\d 数字
\s 匹配任意的空白符,不仅是空格
\w 字母数字下划线汉字
例子:\bhi\b.*\bLucy\b\ 匹配 hi后面不远处跟着一个Lucy
限定符(重复):
* + ? {2} {2,} {2,5}
.*? 匹配任意多个任意字符,尽可能少的(懒惰策略)字符:
[^a-zA-Z],[a-zA-X0-9_]和\w等效(英文)
特殊字符转义为本身:
\. \? \\ \+等等
正斜杠不用转义。
例子:C:\\Windows匹配C:\Windows
deerchao\.net匹配deerchao.net
反义:
\S \D \W ^
\S+ 匹配不包含空白符的字符串。
<a[^>]+>匹配用尖括号括起来的以a开头的字符串
\Bend\w*\b 匹配 end sends endure lender 中的ends和ender
分支:
|(含义为或) 从左到右顺序匹配,符合条件就结束
例子:匹配中国大陆固话:
(\d{4}-|\d{3}-)?(\d{8}|\d{7}) (\d{4}在
\d{3}前面
)
分组:
( )(子表达式)
例子:
匹配IPV4地址
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
后向引用用于重复搜索前面某个分组匹配的文本。
\b(\w+)\b\s+\1\b和\b(?<Word>\w+)\b\s+\k<Word>\b匹配重复的单词(比如go go之类的)
小括号的用途:
分类 | 代码/语法 | 说明 |
---|
捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 |
---|
(?<name>exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) |
(?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 |
零宽断言 | (?=exp) | 匹配exp前面的位置,exp是后缀,不包含exp |
---|
(?<=exp) | 匹配exp后面的位置,exp是前缀,不包含exp |
(?!exp) | 匹配后面跟的不是exp的位置,exp不是后缀,不包含exp |
(?<!exp) | 匹配前面不是exp的位置,exp不是前缀,不包含exp |
注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
---|
例子:
\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词
(?<=\s)\d+(?=\s)匹配以空白符间隔的数字
2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199) 匹配IP地址(包含注释)
贪婪与懒惰:
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
?用来懒惰匹配。
例子:
a.*b 搜索abcb的时候匹配abcb,a.*?b 搜索abcb的时候匹配ab.
平衡组和递归匹配:
附注:
常用正则表达式:
非负整数 \d+
正整数 \d*[1-9]\d* (包含01,不包含00)
整数 -?\d+
实数 -?\d+(\.\d+)?
中文 [\u4e00-\u9fa5]
不含abc的单词 \b((?!abc)\w)+\b
qq号码 [1-9]\d{5,11}
中国大陆邮政编码 [1-9]\d{5}
日期(年-月-日) (\d{4}|\d{2})-((1[0-2])|(0?[1-9]))-(([12][0-9])|(3[01])|(0?[1-9]))
日期(月/日/年) ((1[0-2])|(0?[1-9]))/(([12][0-9])|(3[01])|(0?[1-9]))/(\d{4}|\d{2})
时间(24小时制) ((1|0?)[0-9]|2[0-3]):([0-5][0-9])
中国大陆固话号码 (0\d{3}-|0\d{2}-)?(\d{7}|\d{8})
网址URL [a-zA-z]+://[^\s]*
电子邮件Email \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
IP地址 ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
HTML标记 <(\S*?)[^>]*>.*?</\1>|<.*? />
参考资料:
附注: