正则表达式! 一抄!

正则表达式

(注:本文内容主要是参考:http://www.aspxboy.com/private/426/default.aspx 目前没有通过“DotNet男孩社区”的同意而进行的擅自引用,本人引用于此只为个人学习笔记之用,不用于其他用途,如果有要进行商业行为者,后果自负!)

起源:

正则表达式这个名词,相信很多人都听说过,这个名词最早起源于1956年,一位叫Stephen Kleene的美国数学家在McCullochPitts早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。

随后,发现可以将这一工作应用于使用Ken Thompson的计算搜索算法的一些早期研究,Ken ThompsonUnix的主要发明人。正则表达式的第一个应用程序就是Unix中的qed编辑器。

 

正则表达式:

字符转义表

字符类

含义

.

与除\n以外的任何字符匹配。如果通过Singleline选项(请参阅正则表达式选项)进行了修改,则句点字符与任何字符匹配。

[aeiou]

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

[^aeiou]

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

[0-9a-fA-F]

使用连字号(-)允许指定连续字符范围。

\p{name}

name指定的命名字符类中的任何字符匹配。支持的名称为Unicode组和块范围。

\P{name}

与在{name}中指定的组和块范围中未包含的文本匹配。

\w

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

\W

与任何非单词字符匹配。等效于Unicode类别[^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]。如果通过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\p{Nd}和非Unicode[0-9]以及ECMAScript行为一样。

\D

与任何非数字匹配。与Unicode\P{Nd}和非Unicode[^0-9]以及ECMAScript行为一样。

 

限定符表

限定符

说明

*

指定零个或更多个匹配;如\w*(abc)*。与{0,}相同。

+

指定一个或多个匹配;例如 \w+ (abc)+。与 {1,} 相同。

?

指定零个或一个匹配;例如 \w? (abc)?。与 {0,1} 相同。

{n}

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

{n,}

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

{n,m}

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

*?

指定尽可能少地使用重复的第一个匹配(laze *)。

+?

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

??

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

{n}?

等效于{n}(laze {n})

{n,}?

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

{n,m}?

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

原子零宽度断言

断言

说明

^

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

$

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

\A

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

\Z

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

\z

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

\G

指定匹配必须出现在当前搜索开始的位置(此位置通常是上一次搜索结束位置之后的第一个字符)。例如,请考虑一个由分离的字符组组成的串联字符串,其中每一组的长度都为 n 个字符。在每个字符组中搜索匹配时,如果正则表达式在 0n2n3n 等字符位置找到匹配,则该正则表达式成功。仅当匹配出现在定位组边界上时才会成功。

\b

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

\B

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

 

替换:

上面提到了两种基本的构造分组方式()以及(?<name> ),通过这两种分组方式,我们可以得到形如$1,${name}的匹配结果。

替换

字符

含义

$123

替换由组号 123(十进制)匹配的最后一个子字符串。

${name}

替换由 (?<name> ) 组匹配的最后一个子字符串。

$$

替换单个“$”字符。

$&

替换完全匹配本身的一个副本。

$`

替换匹配前的输入字符串的所有文本。

$'

替换匹配后的输入字符串的所有文本。

$+

替换最后捕获的组。

$_

替换整个输入字符串。

 

分组构造:

最基本的构造方式就是(),在左右括号中括起来的部分,就是一个分组;

更进一步的分组就是形如:(?<name> )的分组方式,这种方式与第一种方式的不同点,就是对分组的部分进行了命名,这样就可以通过该组的命名来获取信息;

分组构造

定义

( )

捕获匹配的子字符串(或非捕获组;有关更多信息,请参阅正则表达式选项中的 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 2005-12-28 11:23  StormForCnblogs  阅读(198)  评论(0)    收藏  举报

导航