正则表达式

ASP.NET 中的验证
ASP.NET 提供了一套验证控件,与使用旧的(或愿意的话使用传统的) ASP 处理任务相比,验证控件使在 Web 窗体上验证输入变得非常容易。其中一个非常有效的验证器是 RegularExpressionValidator,如您所料,它允许您提供必须匹配输入的正则表达式来验证输入。设置控件的 ValidationExpression 属性可指定正则表达式的模式。下面显示了验证邮政代码字段的验证程序:

<asp:RegularExpressionValidator runat="server" id="ZipCodeValidator"
ControlToValidate="ZipCodeTextBox" ErrorMessage="Invalid ZIP code
format; format should be either 12345 or 12345-6789."
ValidationExpression="(\d{5}(-\d{4})?" />

使用 RegularExpressionValidator 要注意几个问题:

• 决不要使用验证程序要验证的控件中的空字符串来激活验证器。只有 RequiredFieldValidator 才可以捕获空字符串。

• 您无需指定匹配字符的开始与结尾(^ 和$)- 它们是事先假设的。如果添加了开始与结尾,也没有任何影响,不需要这样做。

• 对于所有验证控件来说,必须在客户端以及服务器端进行验证。如果正则表达式不是 ECMAScript 兼容方式,客户端验证将失败。为了避免这种情况,确保表达式是 ECMAScript 兼容方式,否则只在服务器端进行控件验证。


返回页首
正则表达式 API
除了 ASP.NET 验证控件,在.NET 中使用正则表达式的大多数情况都要使用 System.Text.RegularExpressions 命名空间中发现的类。特别是那些您希望熟悉的主类 Regex、Match 和 MatchCollection。

顺便说一下,正则表达式缩写样式 regex 的发音究竟是 /reg-eks/ 还是 /rej-eks/,还有一些争议。本人倾向于后者,但两种发音都有专家赞同,所以选择哪个发音由您自己决定。

Regex 类有大量的方法和属性,如果您以前没有用过它,可能会感到无所适从。下面汇总了一些最常用的方法:

方法 说明
Escape / Unescape
字符串中的转义元字符,用作表达式中的文字。

IsMatch
如果正则表达式在输入字符串中发现匹配,返回“Ture”。

Match
如果在输入字符串中发现匹配,则返回匹配对象。

Matches
如果在输入字符串中发现包含任何或全部匹配,则返回匹配集合对象。

Replace
用给定的替换字符串替换输入字符串中的匹配。

Split
将输入字符串拆分成用正则表达式匹配分开的数组元素时,返回数组字符串。


除了指定很多方法外,还有一些选项可以指定,通常在 Regex 对象构造函数中。由于这些选项是位屏蔽的一部分,或许可以同时指定这些选项(如,可以同时指定 Multiline 和 Singleline)。

方法 说明
Compiled
当在循环中执行许多匹配操作时使用此选项。这可以节省每一循环的分析表达式步骤。

Multiline
它与输入字符串中的行数没有关系。确切地说,它只修改 ^ 和 $ 的方式,以便匹配行开始 (BOL) 和行结尾 (EOL),而不是匹配整个输入字符串的开始和结尾。

IgnoreCase
使模式在匹配搜索字符串时忽略大小写。

IgnorePatternWhitespace
允许根据需要在模式中包括任意数量的空白区域,也支持使用 (?# 注释 #) 语法在模式中加入注释。

SingleLine
它与输入字符串中的行数没有关系。更确切地说,它将导致 .(句点)元字符匹配任意字符,而不是除 \n 之外的任意字符(默认情况)。


使用正则表达式常执行的操作包括:验证、匹配和替换。大多数情况下,可以使用 Regex 类的静态方法完成这些操作,不需要实例化 Regex 类本身。要执行验证,全部要做的就是必建或找到正确的表达式,然后使用 Regex 类的 IsMatch() 方法将表达式应用到输入字符串中。例如,下面的函数演示了如何使用正则表达式验证邮政编码:

private void ValidateZipButton_Click(object sender, System.EventArgs e)
{
String ZipRegex = @"^\d{5}$";
if(Regex.IsMatch(ZipTextBox.Text, ZipRegex))
{
ResultLabel.Text = "ZIP is valid!";
}
else
{
ResultLabel.Text = "ZIP is invalid!";
}
}

类似的,可以使用静态 Replace() 方法将匹配替换为特定字符串,如下所示:

String newText = Regex.Replace(inputString, pattern, replacementText);

最后,可以使用如下代码遍历输入字符串的匹配集合:

private void MatchButton_Click(object sender, System.EventArgs e)
{
MatchCollection matches = Regex.Matches(SearchStringTextBox.Text,
MatchExpressionTextBox.Text);
MatchCountLabel.Text = matches.Count.ToString();
MatchesLabel.Text = "";
foreach(Match match in matches)
{
MatchesLabel.Text += "Found" + match.ToString() + " at
position " + match.Index + ".<br>";
}
}

通常,在您需要指定默认方式以外的方式时,需要实例化 Regex 类的实例。特别是在设置选项时。例如,要创建忽略大小写和模式空白区域的 Regex 实例,然后检索与该表达式匹配的集合,则应使用如下代码:

Regex re = new Regex(pattern,
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
MatchCollection mc = re.Matches(inputString);

本文的下载文件中包括这些示例的完整使用版本,与简单 ASP.NET 页中的一样。


资源
正则表达式库 http://www.regexlib.com/

正则表达式讨论列表 http://aspadvice.com/login.aspx?ReturnUrl=%2fSignUp%2flist.aspx%3fl%3d68%26c%3d16&l=68&c=16

正则表达式论坛 http://forums.regexadvice.com/

正则表达式 Web 日志 http://blogs.regexadvice.com/

Mastering Regular Expressions (O'Reilly),作者 Jeffrey Friedl http://www.regex.info/

.NET 正则表达式参考 http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemTextRegularExpressions.asp

Jscript 正则表达式语法 http://www.msdn.microsoft.com/library/en-us/script56/html/js56jsgrpRegExpSyntax.asp

正则表达式信息 http://www.regular-expressions.info

参考资料:http://www.microsoft.com/china/msdn/library/webservices/asp.net/regexnet.mspx?pf=true
posted on 2007-04-14 15:26  石川  阅读(251)  评论(0编辑  收藏  举报