在前一篇文章中,介绍了一些初步的正则表达式的基本概念,相信很多人对正则表达式的基本知识有所了解,接下来,我们结合一些实际的编程示例来掩饰说明正则表达式的作用。
首先,我们先看几个实际的例子:
1. 验证输入字符是否全部为英文字符
javascript:
var ex = "^\\w+$";
var re = new RegExp(ex,"i");
return re.test(str);
VBScript
Dim regEx,flag,ex
ex = "^\w+$"
Set regEx = New RegExp
regEx.IgnoreCase = True
regEx.Global = True
regEx.Pattern = ex
flag = regEx.Test( str )
C#
System.String ex = @"^\w+$";
System.Text.RegularExpressions.Regex reg = new Regex( ex ); bool flag = reg.IsMatch( str );
2. 验证邮件格式
C#
System.String ex = @"^\w+@\w+\.\w+$";
System.Text.RegularExpressions.Regex reg = new Regex( ex );
bool flag = reg.IsMatch( str );
3. 更改日期的格式(用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式)
C#
String MDYToDMY(String input)
{
return Regex.Replace(input,
"\\b(?
1<month>\\\d{1,2})/(?<day>\\\d{1,2})/(?<year>\\\d{2,4})\\\b",
2
3"${day}-${month}-${year}");
4
5}
6
74. 从 URL 提取协议和端口号
8
9C#
10
11String Extension(String url)
12
13{
14
15Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",
16
17RegexOptions.Compiled);
18
19return r.Match(url).Result("${proto}${port}");
20
21}
22
23这里的例子可能是我们在网页开发中,通常会碰到的一些正则表达式,尤其在第一个例子中,给出了使用 javascript,vbScript,C# 等不同语言的实现方式,大家不难看出,对于不同的语言来说,正则表达式没有区别,只是正则表达式的实现类不同而已。而如何发挥正则表达式的公用,也要看实现类的支持。
24
25(摘自 msdn: Microsoft .NET 框架 SDK 提供大量的正则表达式工具,使您能够高效地创建、比较和修改字符串,以及迅速地分析大量文本和数据以搜索、移除和替换文本模式。 ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconregularexpressionslanguageelements.htm )
26
27下面我们逐个来分析这些例子:
28
291-2 ,这两个例子很简单,只是简单的验证字符串是否符合正则表达式规定的格式,其中使用的语法,在第一篇文章中都已经介绍过了,这里做一下简单的描述。
30
31第 1 个例子的表达式: ^\w+$
32
33^ -- 表示限定匹配开始于字符串的开始
34
35\w – 表示匹配英文字符
36
37\+ -- 表示匹配字符出现1次或多次
38
39$ -- 表示匹配字符到字符串结尾处结束
40
41验证形如asgasdfs的字符串
42
43第 2 个例子的表达式: ^\w+@\w+.\w+$
44
45^ -- 表示限定匹配开始于字符串的开始
46
47\w – 表示匹配英文字符
48
49\+ -- 表示匹配字符出现1次或多次
50
51@ -- 匹配普通字符@
52
53\\. – 匹配普通字符.(注意.为特殊字符,因此要加上\转译)
54
55$ -- 表示匹配字符到字符串结尾处结束
56
57验证形如 [email protected] 的邮件格式
58
59第 3 个例子中,使用了替换,因此,我们还是先来看看正则表达式中替换的定义:
60
61( ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconsubstitutions.htm )
62
63# 替换
64
65** 字符 **
66
67|
68
69** 含义 **
70
71---|---
72
73$123
74
75|
76
77替换由组号 123(十进制)匹配的最后一个子字符串。
78
79${name}
80
81|
82
83替换由 (?<name> ) 组匹配的最后一个子字符串。
84
85$$
86
87|
88
89替换单个 “$”字符。
90
91$&
92
93|
94
95替换完全匹配本身的一个副本。
96
97$`
98
99|
100
101替换匹配前的输入字符串的所有文本。
102
103$'
104
105|
106
107替换匹配后的输入字符串的所有文本。
108
109$+
110
111|
112
113替换最后捕获的组。
114
115$_
116
117|
118
119替换整个输入字符串。
120
121# 分组构造
122
123( ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpcongroupingconstructs.htm )
124
125** 分组构造 ** ** **
126
127|
128
129** 定义 ** ** **
130
131---|---
132
133( )
134
135|
136
137捕获匹配的子字符串(或非捕获组;有关更多信息,请参阅正则表达式选项中的 ** ExplicitCapture ** 选项。)使用 () 的捕获根据左括号的顺序从 1 开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本。
138
139(?< _name > _ )
140
141|
142
143将匹配的子字符串捕获到一个组名称或编号名称中。用于 _ name _ 的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如 ` (?'name') ` 。
144
145(?< _name1-name2_ > )
146
147|
148
149平衡组定义。删除先前定义的 _ name2 _ 组的定义并在 _ name1 _ 组中存储先前定义的 _ name2 _ 组和当前组之间的间隔。如果未定义 _ name2 _ 组,则匹配将回溯。由于删除 _ name2 _ 的最后一个定义会显示 _ name2 _ 的先前定义,因此该构造允许将 _ name2 _ 组的捕获堆栈用作计数器以跟踪嵌套构造(如括号)。在此构造中, _ name1 _ 是可选的。可以使用单引号替代尖括号,例如 ` (?'name1-name2') ` 。
150
151(?: )
152
153|
154
155非捕获组。
156
157(?imnsx-imnsx: )
158
159|
160
161应用或禁用子表达式中指定的选项。例如, ` (?i-s: ) ` 将打开不区分大小写并禁用单行模式。有关更多信息,请参阅正则表达式选项。
162
163(?= )
164
165|
166
167零宽度正预测先行断言。仅当子表达式在此位置的右侧匹配时才继续匹配。例如, ` \w+(?=\d) ` 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。
168
169(?! )
170
171|
172
173零宽度负预测先行断言。仅当子表达式不在此位置的右侧匹配时才继续匹配。例如, ` \b(?!un)\w+\b ` 与不以 un 开头的单词匹配。
174
175(?<= )
176
177|
178
179零宽度正回顾后发断言。仅当子表达式在此位置的左侧匹配时才继续匹配。例如, ` (?<=19)99 ` 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。
180
181(?<!-- )
182
183|
184
185零宽度负回顾后发断言。仅当子表达式不在此位置的左侧匹配时才继续匹配。
186
187(?--> )
188
189|
190
191非回溯子表达式(也称为贪婪子表达式)。该子表达式仅完全匹配一次,然后就不会逐段参与回溯了。(也就是说,该子表达式仅与可由该子表达式单独匹配的字符串匹配。)
192
193我们还是先简单的了解一下这两个概念:
194
195分组构造:
196
197最基本的构造方式就是 (), 在左右括号中括起</name></port></proto></year></day></month>