.NET Framework 正则表达式
一.正则表达式中的字符类
1. 正字符组 []
[0-9_a-z] 匹配从0到9,a到z的字符
2. 负字符组 [^]
[^abc] 匹配除abc以外的字符
3.任意字符 .
句点字符 (.) 匹配除 \n(换行符 \u000A)之外的任何字符
4.Unicode类别或Unicode快 \p{name}
Unicode 标准为每个常规类别分配一个字符。 例如,特定字符可以是大写字母(由 Lu 类别表示),十进制数字(Nd 类别)、数学符号(Sm 类别)或段落分隔符(Zl 类别)。 Unicode 标准中的特定字符集也占据连续码位的特定区域或块。 例如,可在 \u0000 和 \u007F 之间找到基本拉丁字符集IsBasicLatin,并可在 \u0600 和 \u06FF 之间找到阿拉伯语字符集IsArabic。
5.负Unicode类别或Unicode快 \P{name}
6.单词字符\w
\w匹配任何单词字符。 单词字符是下表中列出的任何 Unicode 类别的成员。
类别 |
说明 |
Li |
字母 小写 |
Lu |
字母 大写 |
Lt |
字母 首字母大写 |
Lo |
字母 其他 |
Lm |
字幕 修饰符 |
Nd |
数字 十进制 |
Pc |
标点 连接符 |
如果指定了符合 ECMAScript 的行为,则 \w 等效于 [a-zA-Z_0-9]。 有关 ECMAScript 正则表达式的信息
7.非单词字符\W
8.空白字符 \s
匹配任何空白字符,等效于下表转义序列和Unicode类别
类别 |
说明 |
\f |
窗体换页符 \u000C |
\n |
换行符 \u000A |
\r |
回车符 \u000D |
\t |
制表符 \u0009 |
\v |
垂直制表符 \u000B |
\x85 |
省略号 \u0085 |
\p{Z} |
匹配任何分隔符 |
如果指定了符合 ECMAScript 的行为,则 \s 等效于 [\f\n\r\t\v]。
9.非空白字符\S
10.十进制字符 \d
等效于[0-9]
11.非十进制字符 \D
等效于\P{Nd}
二.正则表达式中的字符转义,定位点和限定符号
1.字符转义
字符序列 |
描述 |
以下字符之外的所有字符: .$^{[(|)*+?\ |
|
\a |
与报警符 \u0007匹配 |
\b |
在[character_group]字符类中,与退格键\u0008 匹配。(参见 正则表达式中的字符类。)在字符类之外,\b 是一个与单词边界匹配的定位点。(参见 正则表达式中的定位点。) |
\t |
与制表符 \u0009匹配 |
\r |
与回车符 \u000D 匹配。 请注意 \r 与换行符 \n 不是等效的 |
\v |
垂直制表符 \u000B |
\f |
换页符 \u000A |
\e |
转义符\u001B |
\ nnn |
与 ASCII 字符匹配,其中nnn包含两个或三个数字表示八进制符号代码的。 例如,\040 表示空格字符。 如果此构造只有一个数字(例如,\2)被解释为反向引用,或如果它对应于捕获组的编号,则它被解释为反向引用。 |
\x nn |
与 ASCII 字符匹配,其中nn是两位数字的十六进制码位。 |
\c X |
与 ASCII 控制字符匹配,其中 X 是控制字符的字母。 例如,\cC 是 CTRL-C。 |
\u nnnn |
匹配UTF-16编码,当nnnn是十六进制值 |
\ |
在后面带有不识别为转义符的字符时,与该字符匹配。 例如,\* 匹配星号 (*) 并与 \x2A 相同。 |
2.定位点
定位点 |
描述 |
^ |
匹配字符串或行的开头 |
$ |
匹配字符串或黄的末尾 |
\A |
匹配字符串的开头。不支持多行 |
\Z |
匹配字符串的末尾或出现在字符串末尾的\n之前 |
\z |
匹配字符串的末尾 |
\G |
匹配必须从上一个匹配结束的位置开始(连续匹配) |
\b |
匹配单词边界 |
\B |
匹配不得出现在单词边界上(非字边界) |
3.限定符
贪婪限定符 |
惰性限定符 |
说明 |
* |
*? |
匹配零次或多次 |
+ |
+? |
匹配一次或多次 |
? |
?? |
匹配零次或一次 |
{n} |
{n}? |
准确匹配n次 |
{n,} |
{n,}? |
至少匹配n次 |
{n,m} |
{n,m}? |
从n与m次 |
三.正则表达式中的分组构造
1. 匹配的子表达式 (Subexpression-子表达式)
使用括号的捕获按正则表达式中的左括号顺序从一开始从左到右自动编号
Example: (\w+)\s(\1)\W
模式 |
描述 |
(\w+) |
匹配一个或多个单词字符。 这是第一个捕获组。 |
\s |
与空白字符匹配。 |
(\1) |
与第一个捕获组捕获中的字符串匹配。 这是第二个捕获组。 该示例将其指定到捕获组上,以便重复单词的开始位置可从 Match.Index 属性检测。 |
\W |
匹配包括空格和标点符号的一个非单词字符。 这样可以防止正则表达式模式匹配从第一个捕获组的单词开头的单词。 |
2.命名匹配的子表达式
(?<name>subexpression) 或(?’name’ subexpression) 使用\k<name>在同一表达式中引用子表达式。
(?<duplicateWord>\w+)\s\k<duplicateWord>\W(?<nextWord>\w+)
模式 |
描述 |
(?<duplicateWord>\w+) |
匹配一个或多个单词字符。 命名此捕获组 duplicateWord。 |
\s |
与空白字符匹配。 |
\k<duplicateWord> |
匹配名为 duplicateWord 的捕获的组。 |
\W |
匹配包括空格和标点符号的一个非单词字符。 这样可以防止正则表达式模式匹配从第一个捕获组的单词开头的单词。 |
(?<nextWord>\w+) |
匹配一个或多个单词字符。 命名此捕获组 nextWord。 |
3.平衡组定义
(?<name1-name2>subexpression)或者(?’name1-name2’ subexpression)
^[^<>]*(((?'Open'<)[^<>]*)+((?'Close-Open'>)[^<>]*)+)*(?(Open)(?!))$
模式 |
描述 |
^ |
从字符串的开头部分开始。 |
[^<>]* |
匹配零个或多个不是左侧或右侧角度方括号的字符。 |
(?'Open'<) |
匹配左尖括号并分配给名为 Open 的组。 |
[^<>]* |
匹配零个或多个不是左侧或右侧角度方括号的字符。 |
((?'Open'<)[^<>]*) + |
匹配跟在非左尖括号或非右尖括号的零个或多个字符后面的一个或多个左尖括号匹配项。 这是第二个捕获组。 |
(?'Close-Open'>) |
匹配右尖括号,将 Open 组和当前组分配给 Close 组并删除 Open 组的定义。 |
[^<>]* |
匹配非左尖括号或非右尖括号的任何字符的零个或多个匹配项。 |
((?'Close-Open'>)[^<>]*)+ |
匹配跟在零后面或跟在非左尖括号或非右尖括号的多个字符后面的一个或多个右尖括号匹配项。 在匹配右尖括号时,将 Open 组和当前组分配给 Close 组并删除 Open 组的定义。 这是第三个捕获组。 |
(((?'Open'<)[^<>]*)+((?'Close-Open'>)[^<>]*)+)* |
匹配零个或多个下列模式的匹配项:一个或多个左尖括号匹配项,后跟零个或多个非尖括号字符,后跟一个或多个右尖括号的匹配项,后跟零个或多个非尖括号的匹配项。 在匹配右尖括号时,删除 Open 组的定义,并将 Open 组和当前组之间的子字符串分配给 Close 组。 这是第一个捕获组。 |
(?(Open)(?!)) |
如果 Open 组存在,并可以匹配空字符串,则放弃匹配,但不前移字符串中的正则表达式引擎的位置。 这是零宽度负预测先行断言。 因为空字符串总是隐式地存在于输入字符串中,所以此匹配始终失败。 此匹配的失败表示尖括号不平衡。 |
$ |
匹配输入字符串的末尾部分。 |
最终子表达式 (?(Open)(?!)),指示是否正确平衡输入字符串中的嵌套构造(例如,是否每个左尖括号由右键括号匹配)。 它使用基于有效的捕获组的条件匹配,有关详细信息请参阅正则表达式中的备用构造。 如果定义了 Open 组,则正则表达式引擎会尝试匹配输入字符串中的子表达式 (?!)。 仅当嵌套构造不均衡时,才应该定义 Open 组。因此,要在输入字符串中匹配的模式应该是一个始终导致匹配失败的模式。 在此情况下,(?!) 是始终失败的零宽度负预测先行断言,因为空字符串总是隐式地存在于输入字符串中的下一个位置。
4.非捕获组 (?:subexpression)
5.零宽度正预测先行断言
(?= Subexpression)
子表达式在此位置的右侧结尾匹配时才继续匹配。子表达式匹配不在结果中
Beauty queen of only eighteen。
\b\w+(?=\sof\b) 结果 queen
\b\w+(?=en\b) 结果 que eighte
The dog is Malamute.
\b\w+(?=\sis\b) 结果 dog
先行断言的执行步骤是这样的先从要匹配的字符串中的最右端找到第一个ing(也就是先行断言中的表达式)然后 再匹配其前面的表达式,若无法匹配则继续查找第二个ing 再匹配第二个 ing前面的字符串,若能匹配 则匹配
6.零宽度正回顾后发断言
(?<= Subexpression — 子表达式 )
子表达式在此位置的左侧匹配时才继续匹配
Beauty queen of only eighteen。
(?<=Be)\w+ 结果 auty
后发断言跟先行断言恰恰相反 它的执行步骤是这样的:先从要匹配的字符串中的最左端找到第一个abc(也就是先行断言中的表达式)然后 再匹配其后面的表达式,若无法匹配则继续查找第二个abc 再匹配第二个abc后面的字符串,若能匹配 则匹配
7..零宽度负预测先行断言
(?! Subexpression)
如果Subexpression不匹配,则表达式成立,通常在表达式右侧结尾使用
Beauty queen of only eighteen。
匹配不以Be开头的单词
\b(?!Be)\w+\b 结果 queen of only eighteen
匹配不以。结尾的单词
\b\w+\b(?!\p{P}) 结果 Beauty queen of only
8.零宽度负回顾后发断言
(?<! Subexpression)
如果Subexpression不匹配,则表达式成立,通常在在表达式左侧开头使用
Monday February 1, 2010
Wednesday February 3, 2010
Saturday February 6, 2010
Sunday February 7, 2010
Monday, February 8, 2010
(?<!(Saturday|Sunday) )\b\w+ \d{1,2}, \d{4}\b
结果:February 1, 2010
February 3, 2010
February 8, 2010
模式 |
描述 |
\b |
在单词边界处开始匹配。 |
\w+ |
匹配一个或多个后跟空白字符的单词字符。 |
\d{1,2}, |
匹配空白字符和逗号后面的一个或两个十进制数字。 |
\d{4}\b |
匹配四个十进制数字并在单词边界处结束匹配。 |
(?<!(Saturday|Sunday) ) |
如果匹配以字符串“星期六”或者“星期日”开头,后跟一个空格,则匹配成功。 |
Beauty queen of only eighteen。
匹配不以en结束的单词
\b(\w+(?<!en))\b 结果 Beauty of only
四.正则表达式中的替代
替换 |
说明 |
||||||
$ number |
包括替换字符串中的由 number 标识的捕获组所匹配的最后一个子字符串,其中 number 是一个十进制值。 用索引number的捕获组替换匹配项
|
||||||
${ name } |
包括替换字符串中由 (?<name> ) 指定的命名组所匹配的最后一个子字符串。 |
||||||
$$ |
包括替换字符串中的单个“$”文本。 例如:input:16.32 Pattern:\b(\d+)(\.(\d+))? Replacement:¥ $1$2 Output: ¥ 16.32 |
||||||
$& |
包括替换字符串中整个匹配项的副本。 例如:input:16.32 Pattern:\b(\d+)(\.(\d+))? Replacement:《$&》 Output: 《16.32》 |
||||||
$` |
包括替换字符串中的匹配项前的输入字符串的所有文本。 |
||||||
$' |
包括替换字符串中的匹配项后的输入字符串的所有文本。 |
||||||
$+ |
捕获的最后一个组替换匹配项 例如:input:the the dog jumped over the fence fence. Pattern:\b(\w+)\s\1\b
Replacement:$+ Output: the dog jumped over the fence. |
||||||
$_ |
整个输入字符串替换匹配项 Input:ABC123DEF456 Pattern:\d+ Output:ABCABC123DEF456DEFABC123DEF456 |
资料:https://msdn.microsoft.com/zh-cn/library/hs600312(v=vs.110).aspx
https://msdn.microsoft.com/zh-cn/library/e347654k(v=vs.110).aspx