字符转义

模式 说明 备注
任意字符 除.$^{[(|)*+?\以外的字符,代表自身  
\040 八进制表示的ASCII字符。 \040表示空格
\x20 十六进制表示的ASCII字符。 \x20表示空格
\u0020 十六进制表示的Unicode字符。 \u0020表示空格
\cX ASCII控制字符,其中X是控制字符的字母。 \cC是CTRL-C
\a 报警符(bell) \u0007 \x07
[\b] 退格键 \u0008 \x08
\t 制表符 \u0009 \x09
\n 换行符 \u000A \x0A
\v 垂直制表符 \u000B \x0B
\f 换页符 \u000C \x0C
\r 回车符 \u000D \x0D
\e 转义符 \u001B \x1B
\* 在后面带有不识别为转义符的字符时,与该字符匹配 \*匹配星号(*)并与\x2A相同

正则表达式中的反斜杠(\)指示以下情况之一:

  • 其后的字符是一个特殊的字符。例如,\b是一个指示正则表达式匹配应在单词边界上开始的定位点,\t表示一个制表符,而\x020表示空格。
  • 会以其他方式解释为非转义语言构造的字符应按其原义解释。例如,大括号({)表示数量词的开始,但反斜杠后接大括号(\{)表示大括号直接量。
  • 同样,一个反斜杠标志转义语言构造的开头,但两个反斜杠(\\)则指示反斜杠直接量。
  • 在[]内,开中括号[不需要转义,闭中括号]需要转义。在[]外正好相反。
  • 具体某一个字符是否需要转义,可以利用Regex.(Un)escape(pat)确定。

字符类

字符类模式与一类字符中的任何一个字符匹配。字符类包括下表中列出的语言元素。

*斜线加小写字母表示匹配一类字符,斜线加大写字母表示不匹配一类字符。

模式 否定式 说明 备注
.   匹配除\n之外的任何单个字符。点号在[]和替换字符串表示原有意义,而不是转义字符。 使用s选项,匹配包括\n在内的任何单个字符匹配。
[aeiou]   与[]中的任何单个字符匹配。如[aeiou] 匹配元音字母 字符表中的]字符需要转义。
[^aeiou]   不在[^]中的任何单个字符匹配。如[^aeiou] 匹配不是元音字母的字符  
[a-z]   字符范围:与从a到z的范围中的任何单个字符匹配。如[a-z]匹配字母a到z。 如果[]中包括-,应放在第一位置
[a-z-[aeiou]]   字符类减法,匹配这样一个字符,其属于前面字符类,但不属于后面的字符类。如[a-z-[aeiou]]匹配辅音字母  
\w \W 单词字符* ECMAScript [a-zA-Z_0-9]
\s \S 空白字符* ECMAScript [\f\n\r\t\v]
\d \D 十进制数字* ECMAScript[0-9]
\p{} \P{} 表示Unicode已命名组或块范围,如\p{IsCJKUnifiedIdeographs}表示匹配汉字。  

原子零宽度断言

定位点或原子零宽度断言会使匹配成功或失败,具体取决于字符串中的当前位置,但它们不会使引擎在字符串中前进或使用字符。下表中列出的元字符是定位点。

模式 否定式 说明 模式 输入字符串 匹配
^   匹配字符串的起点。若指定Multiline选项,则匹配行的起点。 ^\d{3} "901-333-" "901-"
$   匹配字符串的终点。若指定Multiline选项,则匹配行的终点。 -\d{3}$ "-901-333" "-333"
\A   匹配字符串的起点。 \A\d{3} "901-" "901"
\Z   匹配字符串的末尾。如果字符串以\n结束,则匹配字符串末尾的\n之前。 -\d{3}\Z "-901-333" "-333"
\z   匹配字符串的末尾。 -\d{3}\z "-901-333" "-333"
\G   连续搜索,匹配上一个匹配的结束点。 \G\(\d\) "(1)(3)(5)[7](9)" "(1)","(3)","(5)"
\b \B 单词边界,匹配\w和\W之间的点。 \Bend\w*\b "end sends endure lender" "ends","ender"
(?=expr)   匹配一点,该点的右侧匹配子表达式。 \w+(?=\.) "He is. The dog ran. The sun is out." "is","ran","out"
(?!expr)   匹配一点,该点的右侧不匹配子表达式。 \b(?!un)\w+\b "unsure sure unity used" "sure","used"
(?<=expr)   匹配一点,该点的左侧匹配子表达式。 (?<=19)\d{2}\b "1851 1999 1950 1905 2003" "99","50","05"
(?<!expr)   匹配一点,该点的左侧不匹配子表达式。 (?<!19)\d{2}\b "1851 1999 1950 1905 2003" "51","03"

数量词

贪婪 懒惰 说明 匹配次数(x)
{n} {n}? 匹配前导元素恰好n次。 n == x
{n,} {n,}? 匹配前导元素至少n次。 n <= x
{n,m} {n,m}? 匹配前导元素至少n次,但不多于m次。 n <= x <= m
* *? {0,}  
+ +? {1,}  
? ?? {0,1}  

分组与选择

序列 说明 备注
(expr) 捕获匹配的子表达式。基于模式中左括号的顺序,对分组从1开始编号。第0组表示与整个模式匹配的字符串  
(?<name>expr) 将匹配的子表达式捕获到一个命名组中。Name不能包括任何标点符号  
(?:expr) 定义非捕获组。与(expr)相同,只是不进行编号  
(?>expr) 非回溯子表达式  
| 匹配以竖线(|)字符分隔的任何一个元素 条件匹配需要注意顺序,先严后宽。(abcd|abc)
(?(expr)yes|no) 如果expr匹配,则与yes部分匹配;否则,与可选的no部分匹配。expr被解释为零宽度断言  
(?(name)yes|no) 如果命名捕获name有匹配项,则与yes部分匹配;否则,与可选的no部分匹配  
(?<name1-name2>expr) 平衡组定义  

后向引用

序列 说明 模式 输入字符串 匹配
\n 后向引用。匹配编号子表达式的值。与八进制的格式相同,但是优先被认为是后向引用 (\w)\1 seek ee
\k<name> 命名后向引用。匹配命名表达式的值 (?<ch>\w)\d\k<ch>   B2B

正则表达式选项

默认情况下,正则表达式模式中带有任意文本字符的输入字符串比较区分大小写,正则表达式模式中的空白将被解释为文本空白字符且正则表达式中的捕获组通过隐式和显式命名。可通过指定正则表达式选项修改默认正则表达式行为的这些和其他数个方面。

RegexOptions成员 内联字符 效果
None   使用默认行为。
IgnoreCase i 使用不区分大小写的匹配。
Multiline m 使用多行模式,其中^和$匹配每行的开头和末尾(不是输入字符串的开头和末尾)。
Singleline s 使用单行模式,点号(.)匹配所有字符(而不是除了\n的所有字符)。又称作dotall。
ExplicitCapture n 不捕获未命名的组。唯一有效的捕获是显式命名或编号的((?<name>expr))形式的组。
IgnorePatternWhitespace x 从模式中排除未转义的空白,并启用数字符号(#)后的注释。
Compiled   将正则表达式编译为程序集。
RightToLeft   更改搜索方向。搜索是从右向左而不是从左向右进行。
ECMAScript   为表达式启用符合ECMAScript的行为。ECMAScript选项只能与IgnoreCase和Multiline选项组合使用。
CultureInvariant   忽略语言的区域性差异。

其他构造

构造 定义 模式 输入字符串 匹配
(?imnsx-imnsx) 指定正则表达式选项,从当前位置至模式字符串终点的范围内启用/禁用一个或多个选项 \bA(?i)b\w+\b "ABA Able Act" "ABA","Able"
(?imnsx-imnsx:expr) 对表达式expr启用或禁用正则表达式选项 A\d{2}(?i:\w+)\b "A12xl A12XL a12xl" "A12xl","A12XL"
(?# 注释) 内联注释,该注释在第一个右括号处终止 \bA(?#words starting with A)\w+\b    
#[至行尾] 启用IgnorePatternWhitespace时,该注释以非转义的#开头,并继续到行的结尾 (?x)\bA\w+\b#words starting with A    

替换模式

替换模式中唯一需要转义的字符就是美元符号。

字符 说明 模式 替换模式 输入字符串 结果字符串
$$ 为字符$ \b(\d+)\s?USD $$$1 103 USD $103
$n 为捕获组n所表示的字符串。 \b(\w+)(\s)(\w+)\b $3$2$1 one two two one
${name} 为命名组name所表示的字符串。 \b(?<w1>\w+)(\s)(?<w2>\w+)\b ${w2} ${w1} one two two one
$+ 为最后捕获的组。 B+(C+) $+ AABBCCDD AACCDD
$` 为输入字符串起点到该匹配起点的子字符串, 同/^(.*)(?=expr)/$1/ B+ $` AABBCC AAAACC
$' 为该匹配终点到输入字符串终点的子字符串, 同/(?<expr)(.*)$/$1/ B+ $' AABBCC AACCCC
$& 为模式表示的整个匹配,同$0 (\$*(\d*(\.+\d+)?){1}) **$& $1.30 **$1.30**
$_ 为整个输入字符串。 B+ $_ AABBCC AAAABBCCCC

匹配中文字符的正则表达式: [\u4e00-\u9fa5]

评注:匹配中文还真是个头疼的事,有了这个表达式就好办了


匹配双字节字符(包括汉字在内):[^\x00-\xff]

评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)


匹配空白行的正则表达式:\n\s*\r

评注:可以用来删除空白行


匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />

评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力


匹配首尾空白字符的正则表达式:^\s*|\s*$

评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式


匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

评注:表单验证时很实用


匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*

评注:网上流传的版本功能很有限,上面这个基本可以满足需求


匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

评注:表单验证时很实用


匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}

评注:匹配形式如 0511-4405222 或 021-87888822


匹配腾讯QQ号:[1-9][0-9]{4,}

评注:腾讯QQ号从10000开始


 

匹配中国邮政编码:[1-9]\d{5}(?!\d)

评注:中国邮政编码为6位数字


匹配身份证:\d{15}|\d{18}

评注:中国的身份证为15位或18位


匹配ip地址:\d+\.\d+\.\d+\.\d+

评注:提取ip地址时有用


匹配特定数字:

^[1-9]\d*$ //匹配正整数

^-[1-9]\d*$ //匹配负整数

^-?[1-9]\d*$ //匹配整数

^[1-9]\d*|0$ //匹配非负整数(正整数 + 0)

^-[1-9]\d*|0$ //匹配非正整数(负整数 + 0)

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮点数

^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配负浮点数

^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮点数

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非负浮点数(正浮点数 + 0)

^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮点数(负浮点数 + 0)

评注:处理大量数据时有用,具体应用时注意修正


Match.before=input.substring(0,match.index)

Match.after=input.substring(match.index+match.length)