ASP.NET 中的正则表达式

 

速成课程

史蒂文·史密斯

2004 年 3 月

适用于:
   Microsoft® .NET Framework
   Microsoft® ASP.NET
   正则表达式 API

总结: 正则表达式是处理文本的非常有用的工具。 无论是需要验证用户输入、在字符串中搜索模式,还是以强大的方式重新设置文本格式,正则表达式都可以提供帮助。 ) (14 个打印页

下载本文的源代码

目录

简介
正则表达式简史
简单表达式
数量词
元字符
字符类
预定义集元字符
示例表达式
ASP.NET 中的验证
正则表达式 API
免费工具
高级主题
结论
资源
关于作者

简介

Microsoft®.NET Framework 中对正则表达式的支持是一流的,即使在 Microsoft® ASP.NET 也有依赖于正则表达式语言的控件。 本文介绍基础知识,并建议在何处了解详细信息。

本文专为在正则表达式方面很少或根本没有经验但熟悉 .NET 中的 ASP.NET 和编程的初学者而设计。 我希望它也能为以前使用过正则表达式的开发人员提供方便的参考/复习,以及我的 正则表达式备忘单。 在本文中,我将讨论:

  1. 正则表达式简史
  2. 简单表达式
  3. 数量词
  4. 元字符
  5. 字符类
  6. 预定义集元字符
  7. 详细示例表达式
  8. ASP.NET 中的验证
  9. 正则表达式 API
  10. 免费工具
  11. 高级主题概述
  12. 摘要和其他资源

如果你对本文或一般正则表达式有疑问,我邀请你在 的 正则表达式邮件列表 上询问他们,当我写这篇文章时,该列表 http://aspadvice.com有超过 350 个订阅者。

正则表达式简史

今天存在的正则表达式是在20世纪50年代发明的。 正则表达式最初用于描述“正则集”,这是神经生理学家正在研究的模式。 第一个正则表达式的功劳授予数学家斯蒂芬·克莱恩。 最终,Ken Thompson 在 qed 和 grep 中构建了对正则表达式的支持,这两者都是非常受欢迎的文本实用工具。 Jeffrey Friedl在他的著作《掌握正则表达式 (第二版) 中进行了更深入的介绍,强烈建议那些希望更多地了解正则表达式背后的理论和历史的人。

在过去的五十年里,正则表达式已经慢慢地从数学的默默无闻发展到许多工具和软件包的装订功能。 虽然正则表达式几十年来一直受到许多 UNIX 工具的支持,但直到过去十年,它们才进入大多数 Windows 开发人员的工具包。 在 Microsoft® Visual Basic® 6 或 Microsoft® VBScript 中使用正则表达式充其量很尴尬,但随着.NET Framework的引入,正则表达式支持是一流的,可供所有 Microsoft 开发人员和所有 .NET 语言使用。

那么,什么是正则表达式呢? 正则表达式是一种可用于显式描述文本字符串中的模式的语言。 除了简单地描述此类模式外,正则表达式引擎通常还可用于循环访问匹配项、将字符串解析为使用模式作为分隔符的子字符串,或者以智能方式替换或重新设置文本格式。 它们提供了一种强大且通常非常简洁的方法来解决与文本操作相关的许多常见任务。

在讨论正则表达式时,通常会根据它们匹配或不匹配的文本来分析它们。 本文 (,在 system.Text.RegularExpressions 类) 中,我们将引用正则表达式交互中的三个玩家:正则表达式 模式输入 字符串以及模式在字符串中所做的任何 匹配 项。

简单表达式

最简单的正则表达式是你已经熟悉的正则表达式,即文本字符串。 可以从字面上描述特定字符串,因此 ,像 foo 这样的正则表达式模式与输入字符串 foo 完全匹配一次。 在这种情况下,它也将匹配输入: 食物相当美味,如果只寻求精确的匹配,则可能不需要。

当然,将确切字符串与自身匹配是正则表达式的一种简单实现,并且不会开始揭示其功能。 如果想要查找以字母 f 开头的所有单词或全部三个字母单词,而不是 foo,该怎么办? 现在,你已经超越了文本字符串在原因) 内可以执行的操作 (,是时候了解有关正则表达式的更多内容了。 下面是一个示例文本表达式及其匹配的一些输入。

模式 输入 (匹配)
foo foo, 食物, 脚, “有邪恶的脚。

数量词

限定符提供了一种在模式中指定允许特定字符或字符集重复的次数的简单方法。 有三个非显式限定符:

  1. *(描述“0 次或更多次出现次数”)
  2. +,用于描述“1 次或更多次”,以及
  3. ,它描述“0 或 1 次出现”。

限定符始终引用 () 限定符左侧紧邻的模式,这通常是一个字符,除非使用括号来创建模式组。 下面是它们匹配的一些示例模式和输入。

模式 输入 (匹配)
佛* foo, foe, 食物, fooot, “忘了它”, 有趣, 浮肿
fo+ foo, foe, food, foot, “忘了它”
佛? foo, foe, 食物, 脚, “忘了它”, 有趣, 浮肿

除了指定给定模式可能恰好出现 0 或 1 次外, 字符还强制模式或子模式匹配输入字符串中的几个字符时匹配最少的字符数。

除了非显式限定符 (通常称为限定符,但我将其与下一组) 区分开来,还有 显式 限定符。 如果限定符在模式的出现次数方面相当模糊,显式限定符允许指定确切的数字、范围或数字集。 显式限定符按照它们所适用的模式进行定位,就像常规限定符一样。 显式限定符使用大括号 {} 和数字值来表示大括号内的出现上限和下限。 例如, x{5} 与 xxxxx) (5 个 x 字符完全匹配。 如果只指定了一个数字,则它用作上限,除非它后跟逗号(如 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:\\ 请注意,我们使用了 ^ 元字符来指示字符串必须以此模式开头,并使用反斜杠元字符转义文本反斜杠。

| (管道) 元字符用于替换,实质上是指定模式中的“此 OR”。 因此,类似 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 表)确定哪些字符包含在该区域中。 如果需要在范围中包含连字符,请将其指定为第一个字符。 例如, [-.? ] 将匹配这四个字符中的任何一个字符, (注意最后一个字符是空格) 。 另请注意,正则表达式元字符在字符类中没有特殊处理,因此它们不需要转义。 将字符类视为与正则表达式世界其余部分不同的语言,具有自己的规则和语法。

还可以通过将克拉 ^ 作为字符类中的第一个字符来取消类来匹配除字符类的成员以外的任何字符。 因此,若要匹配任何非元音字符,可以使用 [^aAeEiIoOuU] 的字符类。 请注意,如果要否定连字符,它应该是字符类中的第二个字符,如 [^-]中所示。 请记住, ^ 在字符类中的含义与正则表达式模式开始时的含义完全不同。

下面列出了一些操作中的字符类示例。

模式 输入 (匹配)
^b[aeiou]t$ 蝙蝠, 赌注, 位, 机器人, 但
^[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”)中,一项新功能将被添加到字符类中,称为字符类减法。 基本上,这将允许从另一个字符类中减去一个字符类,这将提供一种更易读的方式来描述某些模式。 规范现已在 上 https://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 回车符。 下面列出了一些最常见的字符类及其元字符等效项。

Metacharacter 等效字符类
\a 匹配铃 (警报) ;\u0007
\b 匹配单词边界(字符类 除外 ),其中它与 backspace 字符 \u0008 匹配
\t 匹配选项卡;\u0009
\r 匹配回车符;\u000D
\w 匹配垂直选项卡;\u000B
\f 匹配表单源;\u000C
\n 匹配新行;\u000A
\e 匹配转义;\u001B
\040 匹配具有三位数八进制的 ASCII 字符。 \040 表示 Decimal 32) (空格。
\x20 使用 2 位十六进制匹配 ASCII 字符。 在本例中,\x2- 表示一个空格。
\Cc 匹配 ASCII 控件字符,在本例中为 ctrl-C。
\u0020 仅使用四个十六进制数字匹配 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 与任何十进制数字匹配。 等效于 Unicode 的 [\p{Nd}] ,对于非 Unicode、ECMAScript 行为,等效于 [0-9]。
\D 匹配任何非十进制数字。 等效于 Unicode 的 [\P{Nd}] ,对于非 Unicode、ECMAScript 行为,等效于 [^0-9]。

示例表达式

大多数人通过示例学习效果最好,因此下面是一些示例表达式。 有关更多示例,应访问联机正则表达式库,位于 http://RegexLib.com

模式 说明
^\d{5}$ 5 位数字,例如美国邮政编码。
^ (\d{5}) | (\d{5}-\d{4}$ 5 位数字,或 5 位数字-dash-4 位。 这与美国 ZIP 或美国 ZIP+4 格式匹配。
^ (\d{5}) (-\d{4}) ?$ 与之前相同,但更高效。 使用? 使模式的 -4 位部分可选,而不是要求通过替换) (单独比较两个单独的模式。
^[+-]?\d+ (\.\d+) ?$ 匹配具有可选符号的任何实数。
^[+-]?\d*\.?\d*$ 与上述相同,但也匹配空字符串。
^ (20|21|22|23|[01]\d) [0-5]\d$ 匹配任何 24 小时时间值。
/\*.*\*/ 匹配 C 样式注释的内容 /* ... */

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 命名空间中找到的类。 具体而言,要熟悉main类是 RegexMatchMatchCollection

顺便说一句,关于正则表达式的缩写版本是应发音为 /reg-eks/ 还是 /rej-eks/,存在一些争议。 就我个人而言,我更喜欢后者,但两个发音阵营都有专家,所以选择任何听起来更好的你。

Regex 类具有一组丰富的方法和属性,如果以前未使用过,这些方法和属性可能会相当令人生畏。 此处提供了最常用的方法的摘要:

方法 说明
Escape/Unescape 转义字符串中的元字符,以用作表达式中的文本。
IsMatch 如果正则表达式在输入字符串中找到匹配项,则返回 true。
匹配 如果在输入字符串中找到匹配项,则返回 Match 对象。
匹配 返回一个 MatchCollection 对象,其中包含在输入字符串中找到的任何和所有匹配项。
替换 将输入字符串中的匹配项替换为给定的替换字符串。
拆分 通过将输入字符串拆分为由正则表达式匹配项分隔的数组元素,返回字符串数组。

除了许多方法外,还可以指定许多选项,通常在 Regex 对象的构造函数中。 这些选项是位掩码的一部分,因此可以 OR 组合在一起 (是的,你可以同时打开多行和单行) 。

选项 说明
Compiled 如果要在循环中执行许多匹配操作,请使用此选项。 这将保存每次迭代中分析表达式的步骤。
多行 与输入字符串中的行数无关。 相反,这只会修改 和 $ 的行为^,使其与 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 re = new Regex(pattern, 
   RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
MatchCollection mc = re.Matches(inputString);

这些示例的完整工作版本包含在本文的下载中,作为简单 ASP.NET 页。

免费工具

Regulator (http://royo.is-a-geek.com/iserializable/regulator/) - 一种旨在运行客户端的正则表达式测试工具,它通过 Web 服务与 RegexLib 紧密集成,并为 Match、Split、Replace 等提供支持。 包括性能分析和语法突出显示。

http://www.sellsbrothers.com/tools/#regexd RegexDesigner.NET () - 一个功能强大的可视化工具,可帮助你构造和测试正则表达式。 将生成 C# 和/或 VB.NET 代码和编译的程序集,以帮助将表达式集成到应用程序中。

正则表达式 Workbench (v2.0) (https://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=C712F2DF-B026-4D58-8961-4EE2729D7322) - Eric Gunnerson 用于创建、测试和研究正则表达式的工具。 具有“检查-o-matic”功能,允许将鼠标悬停在正则表达式上以解码其含义。

高级主题

真正让我不得不认为的两个正则表达式功能是命名组和查找处理。 由于在极少数情况下你只需要这些主题,因此我仅在此处简要介绍这些主题。

使用命名组,可以命名单个匹配组,然后以编程方式在表达式中引用这些组。 当与 Replace 方法结合使用时,通过重新排列输入字符串中元素的顺序和位置来重新设置输入字符串格式时,这尤其强大。 例如,假设你获得了一个字符串格式为 MM/DD/YYYY 的日期,并且你希望它采用 DD-MM-YYYY 格式。 可以使用编写表达式来捕获第一种格式、循环访问其 Matches 集合、分析每个字符串以及使用字符串操作来生成替换字符串。 这需要相当数量的代码和相当数量的处理。 使用命名组可以完成类似操作,如下所示:

String MDYToDMY(String input)
{
   return Regex.Replace(intput, @"\b(?<month>\d{1,2})/(?<day>\d{1,2}/(?<year>\d{4})\b", "${day}-
${month}-${year}");
}

还可以按编号和名称引用组。 在任何情况下,此类引用统称为 反向引用。 反向引用的另一个常见用途是在匹配表达式本身内,例如此表达式用于查找重复字母: [a-z]\1。 这将匹配“aa”、“bb”、“cc”,与 [a-z]{2} 或 [a-z][a-z][a-z] 等效,并且允许“ab”或“ac”或任何其他双字母组合。 反引用允许表达式记住有关已分析并匹配的输入字符串部分的内容。

“查找处理”是指许多正则表达式引擎支持的正向和负对头和外观隐藏功能。 并非所有正则表达式引擎都支持查找处理的所有变体。 这些构造不使用字符,即使它们可能与它们匹配。 如果不进行查找处理,则无法描述某些模式,尤其是模式的一部分的存在取决于是否存在单独部件的模式。 下面介绍了每种查找风格的语法。

语法 说明
(?=…) 正预测先行
(?!...) 负预测先行
(?<=...) 正预测后行
(?<!...) 负预测后行

需要查找处理的一个示例是密码验证。 请考虑密码限制,其中密码长度必须介于 4 到 8 个字符之间,并且必须至少包含一个数字。 为此,只需测试 \d 匹配项并使用字符串操作来测试长度,但在正则表达式中执行整个操作需要 lookahead。 具体而言,如此表达式所示: ^ (?=.*\d) 。{4,8}$

结论

正则表达式提供了一种非常强大的方法来描述文本中的模式,使其成为字符串验证和操作的绝佳资源。 .NET Framework为其 System.Text.RegularExpressions 命名空间中的正则表达式提供一流的支持,特别是其中找到的 Regex 类。 使用 API 很简单:提出正确的正则表达式通常是很难的部分。 幸运的是,正则表达式具有高度可重用性,并且有许多在线资源,你可以在其中找到其他人设计的表达式,或者获取有关你难以创建的表达式的帮助。

资源

正则表达式库http://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/

掌握正则表达式 (O'Reilly) ,作者:Jeffrey Friedl http://regex.info/

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

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

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

关于作者

史蒂文·史密斯,Microsoft ASP.NET MVP,是 ASPAlliance.com 和 DevAdvice.com 的总裁和所有者。 他还是 ASPSmith Ltd 的所有者和主教练。以 NET 为中心的培训公司。 他撰写了两本书,ASP.NET 开发人员的食谱和 ASP.NET 示例,以及 MSDN 和 AspNetPRO 杂志上的文章。 史蒂夫每年在几次会议上发言,是 INETA演讲者主席团的成员。 Steve 拥有商业管理硕士学位和计算机科学工程理学学士学位。

可在 联系 ssmith@aspalliance.comSteve。

© Microsoft Corporation. 保留所有权利。