学习正则表达式

学习正则表达式

[ 2006-01-07 22:52:46 | 作者: Clingingboy ]
: | |
1.转义字符

大多数重要的正则表达式语言运算符都是非转义的单个字符。转义符 \(单个反斜杠)通知正则表达式分析器反斜杠后面的字符不是运算符。例如,分析器将星号 (*) 视为重复限定符,而将后跟星号的反斜杠 (\*) 视为 Unicode 字符 002A。

下表中列出的字符转义在正则表达式和替换模式中都会被识别。

转义符 说明
一般字符
除 .$ ^ { [ ( | ) * + ? \ 外,其他字符与自身匹配。

\a
与响铃(警报)\u0007 匹配。

\b
如果在 [] 字符类中,则与退格符 \u0008 匹配;如果不是这种情况,请参见本表后面的“注意”部分。

\t
与 Tab 符 \u0009 匹配。

\r
与回车符 \u000D 匹配。

\v
与垂直 Tab 符 \u000B 匹配。

\f
与换页符 \u000C 匹配。

\n
与换行符 \u000A 匹配。

\e
与 Esc 符 \u001B 匹配。

\040
将 ASCII 字符匹配为八进制数(最多三位);如果没有前导零的数字只有一位数或者与捕获组号相对应,则该数字为后向引用。(有关更多信息,请参见反向引用。)例如,字符 \040 表示空格。

\x20
使用十六进制表示形式(恰好两位)与 ASCII 字符匹配。

\cC
与 ASCII 控制字符匹配;例如,\cC 为 Ctrl-C。

\u0020
使用十六进制表示形式(恰好四位)与 Unicode 字符匹配。

注意
.NET Framework 不支持用于指定 Unicode 的 Perl 5 字符转义。Perl 5 字符转义的格式是 \x{####…},其中“####…”是十六进制数字的序列。应改为使用本行中描述的 .NET Framework 字符转义。


\
在后面带有不识别为转义符的字符时,与该字符匹配。例如,\* 与 \x2A 相同。

注意
转义字符 \b 是一个特例。在正则表达式中,\b 表示单词边界(在 \w 和 \W 之间),不过,在 [] 字符类中,\b 表示退格符。在替换模式中,\b 始终表示退格符。

字符类是一个字符集,如果字符集中的任何一个字符有匹配,它就会找到该匹配项。下表总结了字符匹配语法。

2.字符类 说明
.
匹配除 \n 以外的任何字符。如果已用 Singleline 选项做过修改,则句点字符可与任何字符匹配。有关更多信息,请参见正则表达式选项。

[ aeiou ]
与指定字符集中包含的任何单个字符匹配。

[^ aeiou ]
与不在指定字符集中的任何单个字符匹配。

[0-9a-fA-F]
使用连字号 (–) 允许指定连续字符范围。

\p{ name }
与 {name} 指定的命名字符类中的任何字符都匹配。支持的名称为 Unicode 组和块范围。例如,Ll、Nd、Z、IsGreek、IsBoxDrawing。

\P{ name }
与在 {name} 中指定的组和块范围不包括的文本匹配。

\w
与任何单词字符匹配。等效于 Unicode 字符类别 [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]。如果用 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \w 等效于 [a-zA-Z_0-9]。

\W
与任何非单词字符匹配。等效于 Unicode 字符类别 [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]。如果用 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \W 等效于 [^a-zA-Z_0-9]。

\s
与任何空白字符匹配。等效于 Unicode 字符类别 [\f\n\r\t\v\x85\p{Z}]。如果用 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \s 等效于 [ \f\n\r\t\v]。

\S
与任何非空白字符匹配。等效于 Unicode 字符类别 [^\f\n\r\t\v\x85\p{Z}]。如果用 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \S 等效于 [^ \f\n\r\t\v]。

\d
与任何十进制数字匹配。对于 Unicode 类别的 ECMAScript 行为,等效于 \p{Nd},对于非 Unicode 类别的 ECMAScript 行为,等效于 [0-9]。

\D
与任何非数字匹配。对于 Unicode 类别的 ECMAScript 行为,等效于 \P{Nd},对于非 Unicode 类别的 ECMAScript 行为,等效于 [^0-9]。


可以使用 GetUnicodeCategory 方法找到某个字符所属的 Unicode 类别。

有关 Unicode 字符类别的更多信息,请参见文档“Unicode Data File Format”(Unicode 数据文件格式),此文档可从 Unicode 技术委员会 (UTC) 的网站 http://www.unicode.org/Public/UNIDATA/UCD.html#General_Category_Values 获得。

3.限定符
限定符将可选数量的数据添加到正则表达式。限定符表达式应用于紧挨着它前面的字符、组或字符类。.NET Framework 正则表达式支持最小匹配 (lazy) 限定符。

下表描述了影响匹配的元字符。数量 n 和 m 是整数常数。

限定符 说明
*
指定零个或更多个匹配;例如 \w* 或 (abc)*。等效于 {0,}。

+
指定一个或多个匹配;例如 \w+ 或 (abc)+。等效于 {1,}。

?
指定零个或一个匹配;例如 \w? 或 (abc)?。等效于 {0,1}。

{ n }
指定恰好 n 个匹配;例如 (pizza){2}。

{ n ,}
指定至少 n 个匹配;例如 (abc){2,}。

{ n , m }
指定至少 n 个但不多于 m 个匹配。

*?
指定尽可能少地使用重复的第一个匹配(等效于 lazy *)。

+?
指定尽可能少地使用重复但至少使用一次(等效于 lazy +)。

??
指定使用零次重复(如有可能)或一次重复 (lazy ?)。

{ n }?
等效于 {n} (lazy {n})。

{ n ,}?
指定尽可能少地使用重复但至少使用 n 次 (lazy {n,})。

{ n , m }?
指定介于 n 次和 m 次之间、尽可能少地使用重复 (lazy {n,m})。


4.原子零宽度断言

下表中描述的元字符不会使引擎在字符串中前进或使用字符。它们只是根据字符串中的当前位置使匹配成功或失败。例如,^ 指定当前位置在行或字符串的开头。因此,正则表达式 ^FTP 只会返回那些在行的开头出现的字符串“FTP”的匹配项。

断言 说明
^
指定匹配必须出现在字符串的开头或行的开头。有关更多信息,请参见正则表达式选项中的 Multiline 选项。

$
指定匹配必须出现在以下位置:字符串结尾、字符串结尾处的 \n 之前或行的结尾。有关更多信息,请参见正则表达式选项中的 Multiline 选项。

\A
指定匹配必须出现在字符串的开头(忽略 Multiline 选项)。

\Z
指定匹配必须出现在字符串的结尾或字符串结尾处的 \n 之前(忽略 Multiline 选项)。

\z
指定匹配必须出现在字符串的结尾(忽略 Multiline 选项)。

\G
指定匹配必须出现在上一个匹配结束的地方。与 Match.NextMatch() 一起使用时,此断言确保所有匹配都是连续的。

\b
指定匹配必须出现在 \w(字母数字)和 \W(非字母数字)字符之间的边界上。匹配必须出现在单词边界上,即出现在由任何非字母数字字符分隔的单词中第一个或最后一个字符上。

\B
指定匹配不得出现在 \b 边界上。

5.分组构造

分组构造使您可以捕获子表达式组并提高具有非捕获预测先行和回顾后发修饰符的正则表达式的效率。下表描述了正则表达式分组构造。

分组构造 说明
( )
捕获匹配的子字符串(或非捕获组;有关更多信息,请参见正则表达式选项中的 ExplicitCapture 选项)。使用 () 的捕获根据左括号的顺序从 1 开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本。

(?<name> )
将匹配的子字符串捕获到一个组名称或编号名称中。用于 name 的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如 (?'name')。

(?<name1-name2> )
平衡组定义。删除先前定义的 name2 组的定义并在 name1 组中存储先前定义的 name2 组和当前组之间的间隔。如果未定义 name2 组,则匹配将回溯。由于删除 name2 的最后一个定义会显示 name2 的先前定义,因此该构造允许将 name2 组的捕获堆栈用作计数器以跟踪嵌套构造(如括号)。在此构造中,name1 是可选的。可以使用单引号替代尖括号,例如 (?'name1-name2')。

(?: )
非捕获组。

(? imnsx-imnsx : )
应用或禁用子表达式中指定的选项。例如,(?i-s: ) 将打开不区分大小写并禁用单行模式。有关更多信息,请参见正则表达式选项。

(?= )
零宽度正预测先行断言。仅当子表达式在此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。

(?! )
零宽度负预测先行断言。仅当子表达式不在此位置的右侧匹配时才继续匹配。例如,\b(?!un)\w+\b 与不以 un 开头的单词匹配。

(?<= )
零宽度正回顾后发断言。仅当子表达式在此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。

(?<! )
零宽度负回顾后发断言。仅当子表达式不在此位置的左侧匹配时才继续匹配。

(?> )
非回溯子表达式(也称为“贪婪”子表达式)。该子表达式仅完全匹配一次,然后就不会逐段参与回溯了。(也就是说,该子表达式仅与可由该子表达式单独匹配的字符串匹配。)
posted on 2006-08-29 10:45  KADreams  阅读(239)  评论(0)    收藏  举报