学习笔记:ASP.NET 中的正则表达式

来源:互联网 发布:java设置session失效 编辑:程序博客网 时间:2024/06/15 20:49

摘要:正则表达式是一种处理文本的有用工具。无论是验证用户输入、搜索字符串内的模式、还是以各种有效方式重新设置文本格式,正则表达式都非常有用。(摘抄自msdn 开发人员网络http://msdn.microsoft.com/zh-cn/library/ms972966.aspx)

      正则表达式是一种语言,它可以明确描述文本字符串中的模式。除了简单描述这些模式之外,正则表达式引擎通常可用于遍历匹配,并使用模式作为分隔符来将字符串解析为子字符串,或以智能方式替换文本或重新设置文本格式。正则表达式为解决与文本处理有关的许多常见任务提供了有效而简捷的方式。

      在讨论正则表达式时,通常以正则表达式匹配(或不匹配)的文本为基础分析正则表达式。正则表达式交互操作中引用 3 个参与对象:正则表达式的“模式”、“输入”字符串和字符串内的所有模式的“匹配”。

      正则表达式中特殊字符的概念及分类:

非显式限定符

限定符提供了一种简单方法,用于指定在模式中允许特定字符或字符集自身重复出现的次数。有 3 个非显式限定符:

  1. *,描述“出现 0 或多次”。

  2. +,描述“出现 1 或多次”。

  3. ?,描述“出现 0 或 1 次”。

限定符始终引用限定符前(左边)的模式,通常是单个字符,除非使用括号创建模式组。下面是一些模式示例及匹配的输入

模式

输入(匹配)

fo*

foofoe、food、fooot、“forget it”、funny、 puffy

fo+

foofoe、food、foot、“forget it”

fo?

foo、foe、food、foot、“forget it”、funny、puffy

显式限定符

在模式出现次数方面,限定符的概念非常模糊。使用显式限定符则可准确指定数字、范围或数字集。显式限定符位于所应用的模式的后边,这一点与正则限定符一样。显式限定符使用花括号 {} 及其中的数字值表示模式出现次数的上下限。例如,x{5} 将准确匹配 5 个 x 字符 (xxxxx)。如果仅指定一个数字,则表示次数上限;如果数字后跟一个逗号,如 x{5,},表示匹配任何出现次数大于 4 的 x 字符。

模式

输入(匹配)

ab{2}c

abbc、aaabbccc

ab{,2}c

acabcabbc、aabbcc

ab{2,3}c

abbcabbbc、aabbcc、aabbbcc

元字符

在正则表达式中,有一种意义特殊的构造,即元字符。目前已知的元字符有很多,如 *?+{} 字符。其他字符在正则表达式语言中都有特殊的含义。这些字符包括:$ ^ . [ ( | ) ] /

.(句点或点)元字符是最简单但最常用的一个字符。它可匹配任何单字符。如果要指定某些模式可包含任意组合的字符,使用句点非常有用,但一定要在特定长度范围内。此外,我们知道表达式将对包含在较长字符串中的所有模式进行匹配,假如只需要精确匹配模式,又该怎么办?这在验证方案中经常出现,例如,要确保用户输入的邮政编码或电话号码的格式正确。使用 ^ 元字符可指定字符串(或行)的开始,使用 $ 元字符可指定字符串(或行)的结束。通过将这些字符添加到模式的开始和结束处,可强制模式仅匹配精确匹配的输入字符串。如果 ^ 元字符用在方括号 [ ] 指定的字符类的开头,也有特殊的含义。具体内容见下。

/ (反斜杠)元字符既可根据特殊含义“转义”字符,也可指定预定义集合元字符的实例。同样,具体内容见下。为了在正则表达式中包括文字样式的元字符,必须使用反斜杠进行“转义”。例如,如果要匹配以“c:/”开始的字符串,可使用:^c://。注意,要使用 ^ 元字符指出字符串必须以此模式作为开始,然后用反斜杠元字符转义文字反斜杠。

|(管道)元字符用于交替指定,特别用于在模式中指定“此或彼”。例如,a|b 将匹配包含“a”或“b”的任何输入内容,这与字符类 [ab] 非常类似。

字符类

字符类是正则表达式中的“迷你”语言,在方括号 [ ] 中定义。最简单的字符类只不过是括号中的一个字符表,如 [aeiou]。在表达式中使用字符类时,可在模式的此位置使用其中任何一个字符(但只能使用一个字符,除非使用了限定符)。请注意,不能使用字符类定义单词或模式,只能定义单个字符。

要指定任何数值数字,可以使用字符类 [0123456789]。但是,由于这样使用字符不大方便,所以要通过在括号中使用连字符 - 来定义字符的范围。连字符在字符类中有特殊的含义(不是在正则表达式中,因此,准确地说它不能叫正则表达式元字符),且仅在连字符不是第一个字符时,连字符才在字符类中有特殊含义。要使用连字符指定任何数值数字,可以使用 [0-9]。小写字母也一样,可以使用 [a-z],大写字母可以使用 [A-Z]。连字符定义的范围取决于使用的字符集。因此,字符在(例如)ASCII 或 Unicode 表中出现的顺序确定了在范围中包括的字符。如果需要在范围中包括连字符,将它指定为第一个字符。例如:[-.?] 将匹配 4 个字符中任何一个字符(注意,最后的字符是个空格)。另请注意,正则表达式元字符在字符类中不做特殊处理,所以这些元字符不需要转义。考虑到字符类是与其他正则表达式语言分开的一种语言,因此字符类有自己的规则和语法。

如果使用字符 ^ 作为字符类的第一个字符来否定此类,也可以匹配字符类成员以外的任何字符。因此,要匹配任何非元音字符,可以使用字符类 [^aAeEiIoOuU]。注意,如果要否定连字符,应将连字符作为字符类的第二个字符,如 [^-]。记住,^ 在字符类中的作用与它在正则表达式模式中的作用完全不同。

下面列出操作中使用的一些字符类。

模式

输入(匹配)

^b[aeiou]t$

Batbetbitbotbut

^[0-9]{5}$

11111, 12345, 99999

^c://

c:/windowsc://///c:/foo.txtc:/ 后跟任何其他内容

abc$

abc123abc abc 结束的任意字符串

(abc){2,3}

abcabcabcabcabc

^[^-][0-9]$

012、... (不匹配 -0、-1、 -2 等)

最后,括号 ( ) 用于给模式分组。它允许使用限定符让一个完整模式出现多次。为了便于阅读,或分开匹配特定的输入部分,可能允许分析或重新设置格式。

下面列出元字符的一些使用示例。

模式

输入(匹配)

.

abc123

.*

Abc, 123, 任意字符串, 无字符时也匹配

^c://

c:/windowsc://///c:/foo.txtc:/ 后跟任何其他内容

abc$

abc123abc abc 结束的任意字符串

(abc){2,3}

abcabcabcabcabc

预定义的集合元字符

使用目前提供的工具可以完成很多工作。但是,要使用 [0-9] 表示模式中的每个数值数字,或(更糟)使用 [0 -9a -zA-Z]表示任何字母数字字符,还有一段相当漫长的过程。为了减轻处理这些常用但冗长模式的痛苦,事先定义了预定义元字符集合。正则表达式的不同实现定义了不同的预定义元字符集合,下面描述的预定义元字符集合在 .NET Framework 中得到 System.Text.RegularExpressions API 的支持。这些预定义元字符的标准语法是,在反斜杠 / 后跟一个或多个字符。多数预定义元字符只有一个字符,它们的使用很容易,是冗长字符类的理想替代字符。以下是两个示例:/d 匹配所有数值数字,/w 匹配所有单词字符(字母数字加下划线)。例外情况是一些特定字符代码匹配,此时必须指定所匹配字符的地址,如 /u000D 将匹配 Unicode 回车符。下面列出一些最常用的字符类及其等效的元字符。

元字符

等效字符类

/a

匹配铃声(警报);/u0007

/b

匹配字符类外的字边界,它匹配退格字符,/u0008

/t

匹配制表符,/u0009

/r

匹配回车符,/u000D

/w

匹配垂直制表符,/u000B

/f

匹配换页符,/u000C

/n

匹配新行,/u000A

/e

匹配转义符,/u001B

/040

匹配 3 位 8 进制 ASCII 字符。/040 表示空格(十进制数 32)。

/x20

使用 2 位 16 进制数匹配 ASCII 字符。此例中,/x2- 表示空格。

/cC

匹配 ASCII 控制字符,此例中是 ctrl-C。

/u0020

使用 4 位 16 进制数匹配 Unicode 字符。此例中 /u0020 是空格。

/*

不代表预定义字符类的任意字符都只作为该字符本身对待。因此,/* 等同于 /x 2A(是文字 *,不是 * 元字符)。

/p{name}

匹配已命名字符类“name”中的任意字符。支持名称是 Unicode 组和块范围。例如,Ll、Nd、Z、IsGreek、IsBoxDrawing 和 Sc(货币)。

/p{name}

匹配已命名字符类“name”中不包括的文本。

/w

匹配任意单词字符。对于非 Unicode 和 ECMAScript 实现,这等同于 [a-zA-Z_0-9]。在 Unicode 类别中,这等同于 [/p{Ll}/p{Lu}/p{Lt}/p{Lo}/p{Nd}/p{Pc}]

/W

/w 的否定,等效于 ECMAScript 兼容集合 [^a-zA-Z_0-9] 或 Unicode 字符类别 [^/p{Ll}/p{Lu}/p{Lt}/p{Lo}/p{Nd}/p{Pc}]

/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

匹配任意十进制数字。在 ECMAScript 方式下,等效于 Unicode 的 [/p{Nd}]、非 Unicode 的 [0-9]

/D

匹配任意非十进制数字。在 ECMAScript 方式下,等效于 Unicode 的 [/p{Nd}]、非 Unicode 的 [^0-9]

正则表达式 API

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

顺便说一下,正则表达式缩写样式 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}___FCKpd___0quot;;   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);

结论

正则表达式是一种描述文本模式的极有效方法,它使文本模式成为字符串验证和操作的极好资源。.NET Framework 通过 System.Text.RegularExpressions 命名空间(特别是其中的 Regex 类)提供了对正则表达式的强大支持。使用 API 很简单,但编写正确的正则表达式通常比较费力。但幸运的是,正则表达式可以重复使用,您可以通过网络中的各种联机资源,从中找出其他人设计的表达式,或者在创建表达式遇到困难时得到帮助。

资源

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

原创粉丝点击