正则表达式


metacharacter

\b

代表着单词的开头或结尾,也就是单词的分界处,不表示任何字符,只表示一个位置
例如:查找int这个单词,表达式为\bhi\b

.

匹配除了换行符以外的任意字符

\d

匹配一位数字(0、1、2、3、4、5、6、7、8、9)
例如:匹配形如“0xx-xxxxxxx”的电话号码,表达式为0\d\d-\d\d\d\d\d\d\d

\s

匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等

\w

匹配字母或数字或下划线或汉字等
例如:查找一个以“a”开头的单词,表达式为\ba\w*\b

^

匹配字符串/行的开始

$

匹配字符串/行的结束
例如检查一个字符串是不是QQ号,表达式为^\d{5,12}$

\

转义字符,用于取消元字符的特殊意义

重复

*

指定*前一个符号表示的内容可以连续重复使用任意次(可以是0次)以使整个表达式得到匹配
例如:.*连在一起表示任意数量的不包含换行的字符

+

指定+前一个符号表示的内容可以连续重复使用任意次(至少1次)以使整个表达式得到匹配

重复0或1次

指定前一个符号表示的内容必须重复匹配n遍
例如\d{5}表示匹配5位的数字

重复n到更多次

重复n到m次

[]

匹配字符集合

[要匹配的字符集]

*例如,匹配元音字母,表达式为`[aeiou]`*

[字符范围]

*例如,匹配所有的字母,不区分大小写,表达式为`[a-zA-Z]`*

|

分支条件,测试从左向右的多个条件,一旦处于靠前的表达式匹配成功,不再测试之后的条件
例如,匹配4位区号的电话号码,其中区号可以用括号括起来,也可以不用,区号与本地号码之间的可有可无,表达式为\(\d{4}\)[- ]?\d{7}|\d{4}[- ]\d{7}

()

分组,可以在括号内指定子表达式
例如,匹配ip地址,表达式为((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

反义

\W

匹配任意不是字母,数字,下划线,汉字的字符

\S

匹配任意不是空白符的字符

\D

匹配任意非数字的字符

\B

匹配不是单词开头或结束的位置

[^x]

匹配除了x意外的任意字符

[^aeiou]

匹配除了aeiou之外的任意字符
例如,匹配以a开头的用尖括号括起来的字符串,表达式为<a[^>]+>

后向引用

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推
例如,匹配像“go go”这类重复的单词,表达式为\b(\w+)\b\s+\1\b

(?exp)

匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)。要反向引用这个分组捕获的内容,可以使用\k<Word>
*例如,上一个例子可以写成\b(?<word>\w+)\b\s+\k<word>\b

(?:exp)

匹配exp,不捕获匹配的文本,也不给此分组分配组号

零宽断言

零宽度正预测先行断言(?=exp)

表示一个匹配exp的内容的前一个位置
例如,匹配以“ing”结尾的单词,“ing”之前的部分,表达式为\b\w+(?=ing\b)

零宽度正回顾后发断言(?<=exp)

表示一个匹配exp的内容的后一个位置
例如,匹配以“re”开头的单词,“re”之后的部分,表达式为(?<=\bre)\w+\b

零宽度负预测先行断言(?!exp)

表示此位置的后面不能匹配exp
例如,匹配一个三位数,表达式为\d{3}(?!\d)

零宽度负回顾后发断言(?<!exp)

表示此位置的前面不能匹配exp

(?#comment)

注释

贪婪匹配

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。
例如a.*b,表示最长的以a开头,以b结尾的字符串

懒惰匹配

匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复
*例如,a.*?b作用于“aabab”上,会先匹配aab,再匹配ab,因为表示此位置的后面不能匹配exp

懒惰限定符

`*?` 重复任意次,但尽可能少重复
`+?` 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

.Net中正则表达式的选项

在C#中,你可以使用Regex(String, RegexOptions)构造函数来设置正则表达式的处理选项。
如:

Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);
名称 说明
IgnoreCase(忽略大小写) 匹配时不区分大小写
Multiline(多行模式) 更改`^`和`$`的含义,使它们分别在任意一行的行首和行尾匹配,
而不仅仅在整个字符串的开头和结尾匹配。
(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)
Singleline(单行模式) 更改.的含义,使它与每一个字符匹配(包括换行符\n)
IgnorePatternWhitespace(忽略空白) 忽略表达式中的非转义空白并启用由#标记的注释
ExplicitCapture(显式捕获) 仅捕获已被显式命名的组
posted @ 2016-05-12 17:33  不如隐茶去  阅读(259)  评论(0编辑  收藏  举报