.NET Framework 4.0 正则表达式x_第1页
.NET Framework 4.0 正则表达式x_第2页
.NET Framework 4.0 正则表达式x_第3页
.NET Framework 4.0 正则表达式x_第4页
.NET Framework 4.0 正则表达式x_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

正则表达式.NET Framework 4.0 正则表达式.NET Framework 4.0 正则表达式1.NET Framework 正则表达式概述2正则表达式语言元素6.NET Framework 中正则表达式的最佳做法13考虑输入源13适当地处理对象实例化14负责的回溯16只在必要时捕获17正则表达式对象模型19正则表达式引擎19MatchCollection 和 Match 对象22组集合25捕获的组26捕获集合28单个捕获30正则表达式行为的详细信息32正则表达式示例41示例:扫描 HREF42示例:更改日期格式44如何:从 URL 中提取协议和端口号46如何:从字符串中剥离无效字符47如何:验证字符串是否为有效的电子邮件格式48.NET Framework 正则表达式概述正则表达式提供了功能强大、灵活而又高效的方法来处理文本。 正则表达式的全面模式匹配表示法使您可以快速分析大量文本以找到特定的字符模式;验证文本以确保它匹配预定义的模式(如电子邮件地址);提取、编辑、替换或删除文本子字符串;将提取的字符串添加到集合以生成报告。 对于处理字符串或分析大文本块的许多应用程序而言,正则表达式是不可缺少的工具。正则表达式的工作方式使用正则表达式处理文本的中心构件是正则表达式引擎,该引擎在 .NET Framework 中由 System.Text.RegularExpressions.Regex 对象表示。 使用正则表达式处理文本至少要求向该正则表达式引擎提供以下两方面的信息:要在文本中标识的正则表达式模式。在 .NET Framework 中,正则表达式模式用特殊的语法或语言定义,该语法或语言与 Perl 5 正则表达式兼容,并添加了一些其他功能,例如从右到左匹配。 有关更多信息,请参见正则表达式语言元素。要为正则表达式模式分析的文本。Regex 类的方法使您可以执行以下操作:通过调用 IsMatch 方法确定输入文本中是否具有正则表达式模式匹配项。 有关使用 IsMatch 方法验证文本的示例,请参见如何:验证字符串是否为有效的电子邮件格式。通过调用 Match 或 Matches 方法检索匹配正则表达式模式的一个或所有文本匹配项。 第一个方法返回提供有关匹配文本的信息的 Match 对象。 第二个方法返回 MatchCollection 对象,该对象对于在分析的文本中找到的每个匹配项包含一个 Match 对象。通过调用 Replace 方法替换匹配正则表达式模式的文本。 有关使用 Replace 方法更改日期格式和移除字符串中的无效字符的示例,请参见如何:从字符串中剥离无效字符和示例:更改日期格式。有关正则表达式对象模型的概述,请参见正则表达式对象模型。正则表达式示例String 类包括许多字符串搜索和替换方法,当您要在较大字符串中定位文本字符串时,可以使用这些方法。 当您希望在较大字符串中定位若干子字符串之一,或者当您希望在字符串中标识模式时,正则表达式最有用,如以下示例所示。示例 1:替换子字符串假设一个邮件列表包含一些姓名,这些姓名有时包括称谓(Mr.、Mrs.、Miss 或 Ms.)以及姓氏和名字。 如果您从列表中生成信封标签时不希望包括称谓,则可以使用正则表达式移除称谓,如以下示例所示。Imports System.Text.RegularExpressionsModule Example Public Sub Main() Dim pattern As String = (Mr.? |Mrs.? |Miss |Ms.? ) Dim names() As String = Mr. Henry Hunt, Ms. Sara Samuels, _ Abraham Adams, Ms. Nicole Norris For Each name As String In names Console.WriteLine(Regex.Replace(name, pattern, String.Empty) Next End SubEnd Module The example displays the following output: Henry Hunt Sara Samuels Abraham Adams Nicole Norris正则表达式模式 (Mr.? |Mrs.? |Miss |Ms.? ) matches any occurrence of Mr , Mr. , Mrs , Mrs. , Miss , Ms or Ms. . The call to the Regex.Replace method replaces the matched string with String.Empty; in other words, it removes it from the original string.示例 2:标识重复的单词意外地重复单词是编写器常犯的错误。 可以使用正则表达式标识重复的单词,如以下示例所示。Imports System.Text.RegularExpressionsModule modMain Public Sub Main() Dim pattern As String = b(w+?)s1b Dim input As String = This this is a nice day. What about this? This tastes good. I saw a a dog. For Each match As Match In Regex.Matches(input, pattern, RegexOptions.IgnoreCase) Console.WriteLine(0 (duplicates 1) at position 2, _ match.Value, match.Groups(1).Value, match.Index) Next End SubEnd Module The example displays the following output: This this (duplicates This) at position 0 a a (duplicates a) at position 66正则表达式模式 b(w+?)s1b 可以解释如下: b 在单词边界处开始。 (w+) 匹配一个或多个单词字符。 它们一起构成可称为 1 的组。 s 与空白字符匹配。 1 与等于名为 1 的组的子字符串匹配。 b 与字边界匹配。 通过将正则表达式选项设置为 RegexOptions.IgnoreCase,调用 Regex.Matches 方法。 因此,匹配操作不区分大小写,此示例将子字符串“This this”标识为重复。请注意,输入字符串包括子字符串“this. This”。 但是,由于插入标点符号,该子字符串不被标识为重复。示例 3:动态生成区分区域性的正则表达式下面的示例演示如何将正则表达式的功能与 .NET Framework 的全球化功能所提供的灵活性结合在一起。 它使用 NumberFormatInfo 对象确定系统的当前区域性设置中货币值的格式, 然后使用该信息动态构造从文本提取货币值的正则表达式。 对于每个匹配,它提取仅包含数字字符串的子组,将其转换为 Decimal 值,然后计算累计值。Imports System.Collections.GenericImports System.GlobalizationImports System.Text.RegularExpressionsPublic Module Example Public Sub Main() Define text to be parsed. Dim input As String = Office expenses on 2/13/2008: + vbCrLf + _ Paper (500 sheets) $3.95 + vbCrLf + _ Pencils (box of 10) $1.00 + vbCrLf + _ Pens (box of 10) $4.49 + vbCrLf + _ Erasers $2.19 + vbCrLf + _ Ink jet printer $69.95 + vbCrLf + vbCrLf + _ Total Expenses $ 81.58 + vbCrLf Get current cultures NumberFormatInfo object. Dim nfi As NumberFormatInfo = CultureInfo.CurrentCulture.NumberFormat Assign needed property values to variables. Dim currencySymbol As String = nfi.CurrencySymbol Dim symbolPrecedesIfPositive As Boolean = CBool(nfi.CurrencyPositivePattern Mod 2 = 0) Dim groupSeparator As String = nfi.CurrencyGroupSeparator Dim decimalSeparator As String = nfi.CurrencyDecimalSeparator Form regular expression pattern. Dim pattern As String = Regex.Escape(CStr(IIf(symbolPrecedesIfPositive, currencySymbol, ) + _ s*-+? + (0-90,3( + groupSeparator + 0-93)*( + _ Regex.Escape(decimalSeparator) + 0-9+)?) + _ CStr(IIf(Not symbolPrecedesIfPositive, currencySymbol, ) Console.WriteLine(The regular expression pattern is: ) Console.WriteLine( + pattern) Get text that matches regular expression pattern. Dim matches As MatchCollection = Regex.Matches(input, pattern, RegexOptions.IgnorePatternWhitespace) Console.WriteLine(Found 0 matches. , matches.Count) Get numeric string, convert it to a value, and add it to List object. Dim expenses As New List(Of Decimal) For Each match As Match In matches expenses.Add(Decimal.Parse(match.Groups.Item(1).Value) Next Determine whether total is present and if present, whether it is correct. Dim total As Decimal For Each value As Decimal In expenses total += value Next If total / 2 = expenses(expenses.Count - 1) Then Console.WriteLine(The expenses total 0:C2., expenses(expenses.Count - 1) Else Console.WriteLine(The expenses total 0:C2., total) End If End SubEnd Module The example displays the following output: The regular expression pattern is: $s*-+?(0-90,3(,0-93)*.?0-9+) Found 6 matches. The expenses total $81.58.在当前区域性设置为“英语 - 美国”(en-US) 的计算机上,该示例动态生成正则表达式 $s*-+?(0-90,3(,0-93)*(.0-9+)?)。 此正则表达式模式可以解释如下: $ 在输入字符串中查找美元符号 ($) 的一个匹配项。 正则表达式模式字符串包含一个反斜杠来指示按字面解释美元符号而非将其作为正则表达式定位点。 (单独的 $ 符号将指示正则表达式引擎应尝试在字符串的末尾开始匹配。) 为了确保当前区域性设置的货币符号不被错误解释为正则表达式符号,该示例调用 Escape 方法使该字符转义。 s* 查找空白字符的零个或多个匹配项。 -+? 查找正号或负号的零个或一个匹配项。 (0-90,3(,0-93)*(.0-9+)?) 括起此表达式的外部括号将表达式定义为捕获组或子表达式。 如果找到匹配项,则有关匹配字符串的此部分的信息可以从第二个 Group 对象中检索(该对象位于 Match.Groups 属性所返回的 GroupCollection 对象中)。 (集合中的第一个元素表示整个匹配。) 0-90,3 查找十进制数字 0 到 9 的零到三个匹配项。 (,0-93)* 查找后跟三个十进制数字的组分隔符的零个或多个匹配项。 . 查找小数分隔符的一个匹配项。 0-9+ 查找一个或多个十进制数字。 (.0-9+)? 查找后跟至少一个十进制数字的小数分隔符的零个或一个匹配项。 如果在输入字符串中找到所有这些子模式,则匹配成功,并将包含有关匹配的信息的 Match 对象添加到 MatchCollection 对象。标题 说明 正则表达式语言元素 提供有关可用来定义正则表达式的字符集、运算符和构造的信息。 .NET Framework 中正则表达式的最佳做法 提供了用于优化性能的正则表达式和创建强大、 可靠的正则表达式模式的建议。 正则表达式对象模型 提供阐释如何使用正则表达式类的信息和代码示例。 正则表达式行为的详细信息 提供有关 .NET Framework 正则表达式的功能和行为的信息。 正则表达式示例 提供阐释正则表达式的典型用法的代码示例。 正则表达式语言元素正则表达式是正则表达式引擎尝试匹配输入文本的一种模式。 模式由一个或多个字符文本、运算符或构造组成。 有关简单介绍,请参见 .NET Framework 正则表达式。此快速参考中的每一节都列出了可用于定义正则表达式的字符、运算符和构造的一种特定类别。 字符转义 字符类 定位点 分组构造 限定符 反向引用构造 替换构造 替换 其他构造字符转义正则表达式中的反斜杠字符 () 指示其后跟的字符是特殊字符(如下表所示),或应按原义解释该字符。 有关更多信息,请参见字符转义。 转义字符 说明 模式 匹配 a 与报警 (bell) 符 u0007 匹配。 a “Error!” +“u0007”中的“u0007” b 在字符类中,与退格键 u0008 匹配。 b3, “bbbb”中的“bbbb” t 与制表符 u0009 匹配。 (w+)t “item1titem2t”中的“item1t”和“item2t” r 与回车符 u000D 匹配。 (r 与换行符 n 不是等效的。) rn(w+) “rnThese arentwo lines.”中的“rnThese” v 与垂直制表符 u000B 匹配。 v2, “vvv”中的“vvv” f 与换页符 u000C 匹配。 f2, “fff”中的“fff” n 与换行符 u000A 匹配。 rn(w+) “rnThese arentwo lines.”中的“rnThese” e 与转义符 u001B 匹配。 e “x001B”中的“x001B” nnn 使用八进制表示形式指定一个字符(nnn 最多由三位数字组成)。 w040w “a bc d”中的“a b”和“c d” xnn 使用十六进制表示形式指定字符(nn 恰好由两位数字组成)。 wx20w “a bc d”中的“a b”和“c d” cXcx Matches the ASCII control character that is specified by X or x, where X or x is the letter of the control character. cC “x0003”中的“x0003”(Ctrl-C) unnnn Matches a Unicode character by using hexadecimal representation (exactly four digits, as represented by nnnn). wu0020w “a bc d”中的“a b”和“c d” 在后面带有不识别为本主题的此表和其他表中的转义符的字符时,与该字符匹配。 例如,* 与 x2A 相同。 This allows the regular expression engine to disambiguate language elements (such as * or ?) and character literals (represented by * or ?). d+-x*d+d+-x*d+ “(2+2) * 3*9”中的“2+2”和“3*9” 字符类字符类与一组字符中的任何一个字符匹配。 字符类包括下表中列出的语言元素。 有关更多信息,请参见字符类。 字符类 说明 模式 匹配 字符分组 与 character_group 中的任何单个字符匹配。 默认情况下,匹配区分大小写。 ae “gray”中的“a”“lane”中的“a”和“e” 字符分组 非:与不在 character_group 中的任何单个字符匹配。 默认情况下,character_group 中的字符区分大小写。 aei “reign”中的“r”、“g”和“n” first-last 字符范围:与从 first 到 last 的范围中的任何单个字符匹配。 A-Z “AB123”中的“A”和“B” . 通配符:与除 n 之外的任何单个字符匹配。 a.e “nave”中的“ave”“water”中的“ate” pname 与 name 指定的 Unicode 通用类别或命名块中的任何单个字符匹配。 pLupIsCyrillic “City Lights”中的“C”和“L”“em”中的“”和“” Pname 与不在 name 指定的 Unicode 通用类别或命名块中的任何单个字符匹配。 PLuPIsCyrillic “City”中的“i”、“t”和“y”“em”中的“e”和“m” w 与任何单词字符匹配。 w “ID A1.3”中的“I”、“D”、“A”、“1”和“3” W 与任何非单词字符匹配。 W , . in ID A1.3 s 与任何空白字符匹配。 ws “ID A1.3”中的“D” S 与任何非空白字符匹配。 sS “int _ctr”中的“ _” d 与任何十进制数字匹配。 d “4 = IV”中的“4” D 与任何非十进制数字匹配。 D “4 = IV”中的“ ”、“=”、“ ”、“I”和“V” 定位点定位点或原子零宽度断言会使匹配成功或失败,具体取决于字符串中的当前位置,但它们不会使引擎在字符串中前进或使用字符。 下表中列出的元字符是定位点。 有关更多信息,请参见正则表达式中的定位点。 断言 说明 模式 匹配 匹配必须从字符串或一行的开头开始。 d3 “901-333-”中的“901-” $ 匹配必须出现在字符串的末尾或出现在行或字符串末尾的 n 之前。 -d3$ “-901-333”中的“-333” A 匹配必须出现在字符串的开头。 Ad3 901 in“901-” Z 匹配必须出现在字符串的末尾或出现在字符串末尾的 n 之前。 -d3Z “-901-333”中的“-333” z 匹配必须出现在字符串的末尾。 -d3z “-901-333”中的“-333” G 匹配必须出现在上一个匹配结束的地方。 G(d) (1), (3), (5) in (1)(3)(5)7(9) b 匹配必须出现在 w(字母数字)和 W(非字母数字)字符之间的边界上。 bw+sw+b “them theme them them”中的“them them” B 匹配不得出现在 b 边界上。 Bendw*b “end sends endure lender”中的“ends”和“ender” 分组构造分组构造描述了正则表达式的子表达式,通常用于捕获输入字符串的子字符串。 分组构造包括下表中列出的语言元素。 有关更多信息,请参见分组构造。 分组构造 说明 模式 匹配 (子表达式) 捕获匹配的子表达式并将其分配到一个从零开始的序号中。 (w)1 “deep”中的“ee” (?subexpression) 将匹配的子表达式捕获到一个命名组中。 (?w)k “deep”中的“ee” (?subexpression) 定义平衡组定义。 For more information, see the Balancing Group Definition section in 分组构造. (?Open()()*)+(?Close-Open)()*)+)*(?(Open)(?!)$ “3+2(1-3)*(3-1)”中的“(1-3)*(3-1)” (?:子表达式) 定义非捕获组。 Write(?:Line)? “Console.WriteLine()”中的“WriteLine” (?imnsx-imnsx:子表达式) 应用或禁用 子表达式 中指定的选项。 有关更多信息,请参见正则表达式选项。 Ad2(?i:w+)b “A12xl A12XL a12xl”中的“A12xl”和“A12XL” (?=子表达式) 零宽度正预测先行断言。 w+(?=.) “He is. The dog ran. The sun is out.”中的“is”、“ran”和“out” (?!子表达式) 零宽度负预测先行断言。 b(?!un)w+b “unsure sure unity used”中的“sure”和“used” (?=子表达式) 零宽度正回顾后发断言。 (?=19)d2b “1851 1999 1950 1905 2003”中的“99”、“50”和“05” (?!子表达式) 零宽度负回顾后发断言。 (?子表达式) 非回溯(也称为“贪婪”)子表达式。 13579(?A+B+) “1ABB 3ABBC 5AB 5AC”中的“1ABB”、“3ABB”和“5AB” 限定符限定符指定在输入字符串中必须存在上一个元素(可以是字符、组或字符类)的多少个实例才能出现匹配项。 限定符包括下表中列出的语言元素。 有关更多信息,请参见限定符。 限定符 说明 模式 匹配 * 匹配上一个元素零次或多次。 d*. d “.0”,“19.9”和“219.9” + 匹配上一个元素一次或多次。 be+ “been”中的“bee”,“bent”中的“be” ? 匹配上一个元素零次或一次。 rai? n “ran”和“rain” n 匹配上一个元素恰好 n 次。 ,d3 “1,043.6”中的“,043”,“9,876,543,210”中的“,876”、“,543”和“,210” ,n 匹配上一个元素至少 n 次。 d2, “166”,“29”和“1930” n,m 匹配上一个元素至少 n 次,但不多于 m 次。 d3,5 166, 1766819302 in 193024 *? 匹配上一个元素零次或多次,但次数尽可能少。 d*? . d “.0”,“19.9”和“219.9” +? 匹配上一个元素一次或多次,但次数尽可能少。 be+? be in been, be in bent ? 匹配上一个元素零次或一次,但次数尽可能少。 rai? n “ran”和“rain” ?n 匹配前导元素恰好 n 次。 ,d3? “1,043.6”中的“,043”,“9,876,543,210”中的“,876”、“,543”和“,210” ,?n 匹配上一个元素至少 n 次,但次数尽可能少。 d2,? “166”,“29”和“1930” n,m? 匹配上一个元素的次数介于 n 和 m 之间,但次数尽可能少。 d3,5? 166, 17668193, 024 in 193024 反向引用构造反向引用允许在同一正则表达式中随后标识以前匹配的子表达式。 下表列出了 .NET Framework 的正则表达式支持的反向引用构造。 有关更多信息,请参见反向引用构造。 反向引用构造 说明 模式 匹配 编号 后向引用。 匹配编号子表达式的值。 (w)1 “seek”中的“ee” k 命名后向引用。 匹配命名表达式的值。 (?w)k “seek”中的“ee” 替换构造替换构造用于修改正则表达式以启用 either/or 匹配。 这些构造包括下表中列出的语言元素。 有关更多信息,请参见备用构造。 替换构造 说明 模式 匹配 | 匹配以竖线 (|) 字符分隔的任何一个元素。 th(e|is|at) “this is the day.”中的“the”和“this” (?(expression)yes | no) 如果 表达式 匹配,则与 yes 部分匹配;否则,与可选的 no 部分匹配。 表达式 被解释为零宽度断言。 (?(A)Ad2b|bd3b) “A10 C103 910”中的“A10”和“910” (?(名称)yes | no) 如果命名捕获 name 有匹配项,则与 yes 部分匹配;否则,与可选的 no 部分匹配。 (?)?(?(quoted).+?|S+s) “Dogs.jpg Yiska playing.jpg”中的 Dogs.jpg 和 Yiska playing.jpg 替换替换是替换模式中支持的正则表达式语言元素。 有关更多信息,请参见替代。 下表中列出的元字符是原子零宽度断言。 字符 说明 模式 替换模式 输入字符串 结果字符串 $编号 替换按组 number 匹配的子字符串。 b(w+)(s)(w+)b $3$2$1 one two two one $name 替换按命名组 name 匹配的子字符串。 b(?w+)(s)(?w+)b $word2 $word1 one two two one $ 替换字符“$”。 b(d+)s?USD $1 “103 USD” “$103” $& 替换整个匹配项的一个副本。 ($*(d*(.+d+)?)1) *$& “$1.30” “*$1.30*” $ 替换匹配前的输入字符串的所有文本。 B+ $ “AABBCC” “AAAACC” $ 替换匹配后的输入字符串的所有文本。 B+ $ “AABBCC” “AACCCC” $+ 替换最后捕获的组。 B+(C+) $+ “AABBCCDD” AACCDD $_ 替换整个输入字符串。 B+ $_ “AABBCC” “AAAABBCCCC” 其他构造其他构造可修改某个正则表达式模式或提供有关该模式的信息。 下表列出了 .NET Framework 支持的其他构造。 有关更多信息,请参见其他构造。 构造 定义 示例 (?imnsx-imnsx) 在模式中间对诸如不区分大小写这样的选项进行设置或禁用。 有关更多信息,请参见正则表达式选项。 bA(?i)bw+b 匹配“ABA Able Act”中的“ABA”和“Able” (?#注释) 内联注释。 该注释在第一个右括号处终止。 bA(?#Matches words starting with A)w+b # 至行尾 X 模式注释。 该注释以非转义的 # 开头,并继续到行的结尾。 (?x)bAw+b#Matches words starting with A .NET Framework 中正则表达式的最佳做法更新:2011 年 3 月在正则表达式引擎了。.NET 框架是一个功能强大、 功能全面的工具,处理基于模式匹配而不是比较和匹配文本的文本。 在大多数情况下,它将执行模式匹配快速且高效地。 但是,在某些情况下,正则表达式引擎可以似乎是很慢。 在极端情况下甚至会出现停止响应,因为它的过程中几个小时甚至几天处理相对较小的输入。本主题列出了一些开发人员可以通过以确保他们的正则表达式实现最佳性能的最佳做法。 它包含下列部分:考虑输入源适当地处理对象实例化负责的回溯只在必要时捕获相关主题考虑输入源一般情况下,正则表达式可以接受输入的两种类型: 约束或不限制。 输入受限是源自已知或可靠的来源,并按照预定义的格式的文本。 无约束的输入是源自一个不可靠的来源如 web 的用户,并可按照预定义的或预期的格式的文本。正则表达式模式通常会写入与有效的输入相匹配。 这就是开发人员检查他们要然后编写一个相匹配的正则表达式模式匹配的文本。 然后,开发人员确定是否这种模式要求更正或进一步阐述的测试,多个有效的输入项。 模式匹配所有推定有效投入,当它声明为生产准备,并可以包含在一个发布的应用程序。 这使正则表达式模式适用于匹配输入受限。 但是,这并不使其适用于匹配无约束的输入。若要匹配无约束的输入,正则表达式必须能够有效地处理文本的三种:与正则表达式模式匹配的文本。与正则表达式模式不匹配的文本。几乎与正则表达式模式匹配的文本。最后的文本类型是写入处理约束的输入的正则表达式的问题尤为严重。 如果该正则表达式还依赖于 广泛 回溯,正则表达式引擎可以花大量的时间 (在某些情况下很多的小时数或天数) 处理看似无害的文本。为例,请考虑使用非常普遍,但非常有问题的正则表达式,用于验证电子邮件地址的别名。 The regular expression 0-9A-Z(-. w*0-9A-Z)*$ is written to process what is considered to be a valid email address, which consists of an alphanumeric character or underscore, followed by zero or more characters that can be alphanumeric, periods, underscores, or hyphens. 正则表达式必须以一个字母数字字符或下划线结尾。 然而,如下面的示例演示: 虽然此正则表达式处理有效的输入很容易,其性能时非常低效它处理近有效的输入。如从该示例输出所示的正则表达式引擎处理中有效的电子邮件别名,对相同的时间间隔,而不管其长度。 另外一方面近有效的电子邮件地址后能超过五个字符的处理时间大约增加一倍的字符串中的每个其他字符。 这意味着近有效 28 个字符的字符串会处理,采取了一个多小时和近有效 33 个字符的字符串需要进行近一天来处理。此正则表达式完全由考虑进行匹配的输入格式开发的因为它没有考虑到的模式不匹配的输入。 这,反过来,可以允许无约束的输入,几乎与匹配的正则表达式模式显著地降低性能。此问题可以执行以下操作:开发一种模式时, 应考虑如何回溯可能会影响性能,两者的特别是如果您正则表达式为了处理无约束的输入。 有关详细信息,请参阅 回溯的采取收费 部分。全面测试正则表达式使用无效和附近有效的输入,以及有效的输入。 随机生成特定的正则表达式输入,您可以使用 雷克斯$ $,这是从微软研究院的正则表达式探索工具。适当地处理对象实例化在的心了。.NET 框架正则表达式对象模型是 System.Text.RegularExpressions.Regex代表类 正则表达式引擎。 通常,会影响性能的正则表达式的一个最大因素是在 Regex使用引擎。 定义的正则表达式涉及紧密耦合与正则表达式模式的正则表达式引擎。 过程的耦合是否它涉及实例化一个 Regex对象,通过将其构造函数传递一个正则表达式模式或调用的静态方法,并连同该字符串将被分析的正则表达式模式,必然是一个昂贵。 注意 性能影响的使用解释和已编译的正则表达式更详细略请参阅 优化正则表达式性能,第二部分: 采取的回溯的收费 BCL 团队博客中。 可以与一个特定的正则表达式模式耦合的正则表达式引擎,然后使用发动机匹配文本在几个方面:您可以调用静态模式匹配方法,例如 Regex.Match(String, String). 这不需要实例化一个正则表达式对象。您可以实例化一个 Regex对象并调用实例模式匹配方法的一种解释的正则表达式。 这是绑定到一个正则表达式模式的正则表达式引擎的默认方法。 它结果时 Regex对象的实例化不一$ options参数,它包含在$ Compiled标志。您可以实例化一个 Regex对象并调用实例模式匹配方法的已编译的正则表达式。 正则表达式对象表示已编译的模式时 Regex的实例化对象一个$ options参数,它包含在$ Compiled标志。您可以创建一个专用 Regex对象,紧密结合的一种特定的正则表达式模式编译它,并将其保存到一个单独的程序集。 您可以通过调用 Regex.CompileToAssembly方法。正则表达式匹配方法的调用特定的方式可以有很大的影响您的应用程序。 以下各节讨论时,使用静态方法调用、 解释正则表达式和编译正则表达式来提高应用程序的性能。 重要事项 形式的方法调用 (静态、 解释、 编译) 会影响性能,如果在方法调用中重复使用相同的正则表达式或应用程序进行广泛使用正则表达式的对象。 静态正则表达式静态正则表达式的方法建议作为重复实例化一个具有相同的正则表达式的正则表达式对象的替代方法。 与正则表达式对象使用的正则表达式模式,不同的操作代码或编译的 Microsoft 中间语言 (MSIL) 从实例方法调用中使用的模式都在内部缓存的正则表达式引擎。为例,一个事件处理程序也经常需要另一种方法来验证用户输入。 这一点反映在下面的代码中的一个 Button控制的 Click事件可以用来调用名为 IsValidCurrency$,用来检查用户是否已输入货币符号后面的至少一个十进制数字。IsValidCurrency方法显示在下面的示例$ 的一种非常低效的实现 请注意每个方法调用 reinstantiates Regex对象相同的模式。 这,反过来,意味着正则表达式模式必须重新编译每次调用该方法。应将此效率低下的代码替换调用静态 Regex.IsMatch(String, String)方法。 这消除了需要实例化 Regex的对象每次你想要调用一个模式匹配的方法,使正则表达式引擎检索的正则表达式从其缓存的已编译的版本默认情况下,最后 15 最近使用静态正则表达式模式进行高速缓存。 需要更多的缓存静态正则表达式的应用程序可以调整高速缓存大小设置 Regex.CacheSize属性。正则表达式 pSc+s*d+,用于在此示例验证输入的字符串包含货币符号和至少一个十进制数字。 模式定义如下表中所示。 模式 说明 pSc+ 匹配 Unicode 的符号货币类别中的一个或多个字符。 s* 匹配零个或多个空白字符。 d+ 匹配一个或多个十进制数字。 解释的 vs。已编译的正则表达式正则表达式模式,不会将其绑定到的正则表达式引擎通过规范 Compiled选项解释。 当正则表达式对象实例化时,正则表达式引擎会将正则表达式转换为一组的操作代码。 在调用实例方法时操作代码转换为 MSIL 并由 JIT 编译器执行。 同样地,当调用静态正则表达式在高速缓存中找不到正则表达式时,正则表达式引擎将正则表达式转换为一组的操作代码,并将它们存储在缓存中。 它然后转换这些操作代码 MSIL,使 JIT 编译器可以执行它们。 解释正则表达式减少启动时间较慢的执行时间为代价。 由于这些他们是最好使用少量的方法调用中使用正则表达式时,或如果对正则表达式的方法的调用的精确数字是未知的但预计要小。 由于减少了的启动时间从性能增益方法调用增加的数目小巫见大巫速度较慢的执行速度。绑定到通过 规范的正则表达式引擎的正则表达式模式 Compiled选项编译。 这意味着,当一个正则表达式对象实例化时,或当调用静态正则表达式和正则表达式不能在缓存中找到,正则表达式引擎转换正则表达式,然后将转换为 MSIL 的操作代码的中间部分。 在调用方法时 JIT 编译器执行 MSIL。 解释的正则表达式相对于已编译的正则表达式增加启动时间,但更快地执行各个模式匹配的方法。 这样一来,从编译正则表达式的结果的性能收益增加的正则表达式的方法调用的数量成比例地。若要总结,我们推荐您使用解释正则表达式,当您调用特定的正则表达式的正则表达式的方法较少。 相对频繁地调用特定的正则表达式的正则表达式的方法时,应使用已编译的正则表达式。 在较慢的执行速度,解释正则表达式的超过他们的减少了的启动时间获利的确切阈值或阈值的速度较慢的启动时间,已编译的正则表达式的比他们更快的执行速度带来的收益很难确定。 这取决于各种包括复杂的正则表达式和处理的特定数据的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论