正则表达式
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(显式捕获) | 仅捕获已被显式命名的组 |