<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>
ASP.NET 中的正则表达式
发布日期: 8/17/2004 | 更新日期: 8/17/2004
速成课程
Steven A. Smith
适用范围:
Microsoft® .NET Framework
Microsoft® ASP.NET
正则表达式 API
摘要:正则表达式是一种处理文本的有用工具。无论是验证用户输入、搜索字符串内的模式、还是以各种有效方式重新设置文本格式,正则表达式都非常有用。
下载本文的源代码。
本页内容
引言
Microsoft®.NET Framework 对正则表达式的支持是一流的,甚至在 Microsoft® ASP.NET 中也有依赖正则表达式语言的控件。本文介绍了深入学习正则表达式的基础知识和推荐内容。
本文主要面向对正则表达式知之甚少或没有使用经验,但却熟悉 ASP.NET、可借助 .NET 编程的初学者。此外,希望本文连同 regular expression cheat sheet 成为有正则表达式使用经验的开发者的手头参考资料或进修资料。本文讨论内容如下:
1. |
正则表达式使用历史简介 |
2. |
简单表达式 |
3. |
限定符 |
4. |
元字符 |
5. |
字符类 |
6. |
预定义的集合元字符 |
7. |
表达式示例详细内容 |
8. |
ASP.NET 中的验证 |
9. |
正则表达式 API |
10. |
免费工具 |
11. |
高级主题概述 |
12. |
小结和其他资源 |
通常,如果对本文或对正则表达式有疑问,请访问 http://www.aspadvice.com/,通过 regex mailing list 提出问题。编写此文时其中已有 350 多个订户参与。
正则表达式使用历史简介
正则表达式设计于五十年代,存在至今。正则表达式最初用于描述“正则集”,它们是一些神经生理学家研究的模式。正则表达式最早由数学家 Stephen Kleene 提出,最终由 Ken Thompson 在两种非常流行的文本实用程序 qed 和 grep 中使用。Jeffrey Friedl 在其著作“Mastering Regular Expressions (2nd edition)”中对此作了进一步阐述。建议那些希望更多了解正则表达式理论和历史的人看看这本书。
在最近的五十年中,正则表达式逐渐从模糊深奥的数学概念发展为在各类工具和软件包中应用的主要功能。尽管数十年来很多 UNIX 工具都支持正则表达式,但仅仅是近十年来,它才在大部分 Windows 开发者工具包中得到体现。在 Microsoft® Visual Basic® 6 或 Microsoft® VBScript 中,即使情况理想,正则表达式仍难以使用。但随着.NET Framework 的推行,正则表达式的支持发展到极点,所有 Microsoft 开发者和所有 .NET 语言都可以使用正则表达式。
那么,正则表达式究竟是什么呢?正则表达式是一种语言,它可以明确描述文本字符串中的模式。除了简单描述这些模式之外,正则表达式引擎通常可用于遍历匹配,并使用模式作为分隔符来将字符串解析为子字符串,或以智能方式替换文本或重新设置文本格式。正则表达式为解决与文本处理有关的许多常见任务提供了有效而简捷的方式。
在讨论正则表达式时,通常以正则表达式匹配(或不匹配)的文本为基础分析正则表达式。本文(以及 System.Text.RegularExpressions 类)将在正则表达式交互操作中引用 3 个参与对象:正则表达式的“模式”、“输入”字符串和字符串内的所有模式的“匹配”。
简单表达式
最简单的正则表达式大家都已熟悉,即文字字符串。特定的字符串可通过文字本身加以描述;像 foo 这样的正则表达式模式可精确匹配输入的字符串 foo。在本例中,也将匹配如下输入:The food was quite tasty,如果希望精确匹配,这可能不是预期结果。
当然,使用正则表达式匹配等于它自身的精确字符串是没有价值的实现,不能体现正则表达式的真正作用。假如不查找 foo,而是查找以字母 f 开头的所有单词,或所有 3 个字母的单词,那该怎么办?目前,这超出了文字字符串的合理范围。我们需要更加深入地研究正则表达式。下面是一个文字表达式示例及一些匹配的输入。
foo |
foo、food、foot、“There's evil afoot.” |
限定符
限定符提供了一种简单方法,用于指定在模式中允许特定字符或字符集自身重复出现的次数。有 3 个非显式限定符:
1. |
*,描述“出现 0 或多次”。 |
2. |
+,描述“出现 1 或多次”。 |
3. |
?,描述“出现 0 或 1 次”。 |
限定符始终引用限定符前(左边)的模式,通常是单个字符,除非使用括号创建模式组。下面是一些模式示例及匹配的输入。
fo* |
foo、foe、food、fooot、“forget it”、funny、 puffy |
fo+ |
foo、foe、food、foot、“forget it” |
fo? |
foo、foe、food、foot、“forget it”、funny、puffy |
除了指定给定模式准确出现 0 或 1 次之外,? 字符还可强制模式或子模式匹配数目最少的字符(如果匹配输入字符串中的多个字符)。
除了非显式限定符(一般叫做限定符,但为区别于下一组,故称非显式限定符)之外,还有显式限定符。在模式出现次数方面,限定符的概念非常模糊。使用显式限定符则可准确指定数字、范围或数字集。显式限定符位于所应用的模式的后边,这一点与正则限定符一样。显式限定符使用花括号 {} 及其中的数字值表示模式出现次数的上下限。例如,x{5} 将准确匹配 5 个 x 字符 (xxxxx)。如果仅指定一个数字,则表示次数上限;如果数字后跟一个逗号,如 x{5,},表示匹配任何出现次数大于 4 的 x 字符。下面是一些模式示例及匹配的输入。
ab{2}c |
abbc、aaabbccc |
ab{,2}c |
ac、abc、abbc、aabbcc |
ab{2,3}c |
abbc、abbbc、aabbcc、aabbbcc |
元字符
在正则表达式中,有一种意义特殊的构造,即元字符。目前已知的元字符有很多,如 *、?、+ 和 {} 字符。其他字符在正则表达式语言中都有特殊的含义。这些字符包括:$ ^ . [ ( | ) ] 和 \。
.(句点或点)元字符是最简单但最常用的一个字符。它可匹配任何单字符。如果要指定某些模式可包含任意组合的字符,使用句点非常有用,但一定要在特定长度范围内。此外,我们知道表达式将对包含在较长字符串中的所有模式进行匹配,假如只需要精确匹配模式,又该怎么办?这在验证方案中经常出现,例如,要确保用户输入的邮政编码或电话号码的格式正确。使用 ^ 元字符可指定字符串(或行)的开始,使用 $ 元字符可指定字符串(或行)的结束。通过将这些字符添加到模式的开始和结束处,可强制模式仅匹配精确匹配的输入字符串。如果 ^ 元字符用在方括号 [ ] 指定的字符类的开头,也有特殊的含义。具体内容见下。
\ (反斜杠)元字符既可根据特殊含义“转义”字符,也可指定预定义集合元字符的实例。同样,具体内容见下。为了在正则表达式中包括文字样式的元字符,必须使用反斜杠进行“转义”。例如,如果要匹配以“c:\”开始的字符串,可使用:^c:\\。注意,要使用 ^ 元字符指出字符串必须以此模式作为开始,然后用反斜杠元字符转义文字反斜杠。
|(管道)元字符用于交替指定,特别用于在模式中指定“此或彼”。例如,a|b 将匹配包含“a”或“b”的任何输入内容,这与字符类 [ab] 非常类似。
最后,括号 ( ) 用于给模式分组。它允许使用限定符让一个完整模式出现多次。为了便于阅读,或分开匹配特定的输入部分,可能允许分析或重新设置格式。
下面列出元字符的一些使用示例。
. |
a、b、c、1、2、3 |
.* |
Abc, 123, 任意字符串, 无字符时也匹配 |
^c:\\ |
c:\windows、c:\\\\\、c:\foo.txt、c:\ 后跟任何其他内容 |
abc$ |
abc、123abc、以 abc 结束的任意字符串 |
(abc){2,3} |
abcabc、abcabcabc |
字符类
字符类是正则表达式中的“迷你”语言,在方括号 [ ] 中定义。最简单的字符类只不过是括号中的一个字符表,如 [aeiou]。在表达式中使用字符类时,可在模式的此位置使用其中任何一个字符(但只能使用一个字符,除非使用了限定符)。请注意,不能使用字符类定义单词或模式,只能定义单个字符。
要指定任何数值数字,可以使用字符类 [0123456789]。但是,由于这样使用字符不大方便,所以要通过在括号中使用连字符 - 来定义字符的范围。连字符在字符类中有特殊的含义(不是在正则表达式中,因此,准确地说它不能叫正则表达式元字符),且仅在连字符不是第一个字符时,连字符才在字符类中有特殊含义。要使用连字符指定任何数值数字,可以使用 [0-9]。小写字母也一样,可以使用 [a-z],大写字母可以使用 [A-Z]。连字符定义的范围取决于使用的字符集。因此,字符在(例如)ASCII 或 Unicode 表中出现的顺序确定了在范围中包括的字符。如果需要在范围中包括连字符,将它指定为第一个字符。例如:[-.?] 将匹配 4 个字符中任何一个字符(注意,最后的字符是个空格)。另请注意,正则表达式元字符在字符类中不做特殊处理,所以这些元字符不需要转义。考虑到字符类是与其他正则表达式语言分开的一种语言,因此字符类有自己的规则和语法。
如果使用字符 ^ 作为字符类的第一个字符来否定此类,也可以匹配字符类成员以外的任何字符。因此,要匹配任何非元音字符,可以使用字符类 [^aAeEiIoOuU]。注意,如果要否定连字符,应将连字符作为字符类的第二个字符,如 [^-]。记住,^ 在字符类中的作用与它在正则表达式模式中的作用完全不同。
下面列出操作中使用的一些字符类。
^b[aeiou]t$ |
Bat、bet、bit、bot、but |
^[0-9]{5}$ |
11111, 12345, 99999 |
^c:\\ |
c:\windows、c:\\\\\、c:\foo.txt、c:\ 后跟任何其他内容 |
abc$ |
abc、123abc、以 abc 结束的任意字符串 |
(abc){2,3} |
abcabc、abcabcabc |
^[^-][0-9]$ |
0、1、2、... (不匹配 -0、-1、 -2 等) |
在 .NET Framework 的下一版中,代码名“Whidbey”作为一种新功能被添加到字符类中,称作字符类差 (character class subtraction)。它的主要作用是,允许从一个字符类中减去另一个字符类,可提供更可读的方式描述某些模式。该规范可通过以下地址访问:http://www.gotdotnet.com/team/clr/bcl/TechArticles/techarticles/Specs/Regex/CharacterClassSubtraction.doc。它的语法类似 [a-z-[aeiou]],匹配所有的小写辅音字母。
预定义的集合元字符
使用目前提供的工具可以完成很多工作。但是,要使用 [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 是空格。 |
\* |
不代表预定义字符类的任意字符都只作为该字符本身对待。因此,\* 等同于 \x2A(是文字 *,不是 * 元字符)。 |
\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]。 |
表达式示例
很多人都喜欢通过示例学习,下面即提供一些表达式示例。要获取更多示例,请访问以下地址中的正则表达式联机数据库:http://www.regexlib.com/。
^\d{5}$ |
5 个数值数字,如美国邮政编码。 |
^(\d{5})|(\d{5}-\d{4}$ |
5 个数值数字或 5 个数字-短划线-4 个数字。匹配 5 位数字格式的美国邮政编码,或 5 位数字 + 4 位数字格式的美国邮政编码。 |
^(\d{5}(-\d{4})?$ |
与前一个相同,但更有效。使用 ? 可使模式中的 4 位数字成为可选部分,而不是要求分别比较不同的两个模式(通过另一种方式)。 |
^[+-]?\d+(\.\d+)?$ |
匹配任意有可选符号的实数。 |
^[+-]?\d*\.?\d*$ |
与上一个相同,但也匹配空字符串。 |
^(20|21|22|23|[01]\d)[0-5]\d$ |
匹配 24 小时制时间值。 |
/\*.*\*/ |
匹配 C 语言风格的注释 /* ... */ |
相关推荐
基于.net的正则表达式编辑调试工具,可用于即时调试并编写正则表达式,更可自由设置运行环境并根据VB.net或c#.net语言自动生成代码,十分好用的一个绿色工具。
说明:.Net正则表达式测试工具,这下测试正则表达式方便多啦,不用麻烦得调试了
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。 Matcher 一个Matcher对象是一个...
提取了boost::regex里边的几个正则表达式匹配搜索接口,打包成DLL,以在不依赖于boost的情况下独立编译运行
regexdesigner.net是一个强力的可视化工具,可以帮助我们构建与测试.NET正则表达式,RegexDesigner.NET让我们将我们开发出的正则表达式集成到我们的应用程序,可以方便的生成C#或VB.NET代码并编译成程序集 ...
regexdesigner.net是一个强力的可视化工具,可以帮助我们构建与测试.NET正则表达式,RegexDesigner.NET让我们将我们开发出的正则表达式集成到我们的应用程序,可以方便的生成C#或VB.NET代码并编译成程序集 ...
自从jdk1.4推出java.util.regex包,就为我们提供了很好的JAVA正则表达式应用平台。 因为正则表达式是一个很庞杂的体系,所以我仅例举些入门的概念,更多的请参阅相关书籍及自行摸索。 \\ 反斜杠 \t 间隔 ('\u0009...
非常棒的正则表达式速成教程,号称30分钟叫你学会正则表达式常用用法。我本人学了一下,感觉不赖,不过俺比较笨,30分钟的东西学了3个多小时,已经从什么都不会变成会编各种复杂的正则筛选条件了^^!这个教程是配合...
正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式
regexdesigner.net是一个强力的可视化工具,可以帮助我们构建与测试.NET正则表达式,RegexDesigner.NET让我们将我们开发出的正则表达式集成到我们的应用程序,可以方便的生成C#或VB.NET代码并编译成程序集
regex-正则表达式教程.pdf
regex tester 中文版 正则表达式 测试工具 。
正则表达式工具 Match Tracer 是一款用来编写和测试正则表达式的工具软件。 本软件通过可视化的界面,可以协助你快速、正确地写出复杂的正则表达式。 主要功能: 根据正则表达式语法,彩色显示表达式,使表达式...
“半年前我对正则表达式产生了兴趣,在网上查找过不少资料,看过不少的教程,最后在使用一个正则表达式工具RegexBuddy时发现他的教程写的非常好,可以说是我目前见过最好的正则表达式教程。于是一直想把他翻译过来。...
Regex c# .net 正则表达式基类,最全面的正则表达式基础类,方便调用,作者肖俊
RegexTester.exe(.net正则表达式测试工具)
如今,正则表达式已经成为众多语言及工具——Perl、PHP、Java、Python、Ruby、MysQL、VB.NET和c#(以及.NET Framework中的任何语言)——中的标准特性,依靠它,你能以之前完全不敢设想的方式进行复杂而精巧的文本...
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。...正则表达式通常缩写成"regex",单数有regexp、regex,复数有regexps、regexes、regexen。
正则表达式测试工具正则表达式测试工具正则表达式测试工具正则表达式测试工具
[1]里面在包括一个正则表达式测试小程序 RegexTester.exe [2]正则表达式30分钟入门教程.pdf] [3]正则表达式规则.doc [4]正则表达式30分钟入门教程.mht 自己整理用的,现在分享一下吧。 当然也是为了赚一些...