VB.Net - 正则表达式

  • 简述

    正则表达式是一种可以与输入文本匹配的模式。.Net 框架提供了允许这种匹配的正则表达式引擎。模式由一个或多个字符文字、运算符或构造组成。
  • 字符转义

    这些基本上是特殊字符或转义字符。正则表达式中的反斜杠字符 (\) 表示它后面的字符要么是特殊字符,要么应该按字面解释。
    下表列出了转义字符 -
    转义字符 描述 模式 匹配
    \a 匹配钟形字符 \u0007。 \a "\u0007" 在 "Warning!" + '\u0007' 中
    \b 在字符类中,匹配退格符 \u0008。 [\b]{3,} "\b\b\b\b" 中的 "\b\b\b\b"
    \t 匹配制表符 \u0009。 (\w+)\t “Name\tAddr\t”中的“Name\t”、“Addr\t”
    \r 匹配回车,\u000D。(\r 不等同于换行符 \n。) \r\n(\w+) “\r\nHello”在“\r\Hello\nWorld”中。
    \v 匹配垂直制表符 \u000B。 [\v]{2,} "\v\v\v" 中的 "\v\v\v"
    \f 匹配换页,\u000C。 [\f]{2,} “\f\f\f”中的“\f\f\f”
    \n 匹配一个新行,\u000A。 \r\n(\w+) “\r\nHello”在“\r\Hello\nWorld”中。
    \e 匹配转义符 \u001B。 \和 “\x001B”中的“\x001B”
    \ nnn 使用八进制表示来指定一个字符(nnn 最多由三个数字组成)。 \w\040\w “a b”、“c d”中的“a bc d”
    \x nn 使用十六进制表示来指定一个字符(nn 正好由两个数字组成)。 \w\x20\w “a b”、“c d”中的“a bc d”
    \c X\c x 匹配由 X 或 x 指定的 ASCII 控制字符,其中 X 或 x 是控制字符的字母。 \cC "\x0003" 中的 "\x0003" (Ctrl-C)
    \u nnnn 使用十六进制表示匹配 Unicode 字符(正好四位数字,由 nnnn 表示)。 \w\u0020\w “a b”、“c d”中的“a bc d”
    \ 当后跟未被识别为转义字符的字符时,匹配该字符。 \d+[\+-x\*]\d+\d+[\+-x\*\d+ "(2+2) * 3*9" 中的 "2+2" 和 "3*9"
  • 字符类

    字符类匹配一组字符中的任何一个。下表描述了字符类 -
    \p{Lu}
    字符类 描述 模式 匹配
    [character_group] 匹配 character_group 中的任何单个字符。默认情况下,匹配区分大小写。 [mn] "m" in "mat" "m", "n" in "moon"
    [^character_group] 否定:匹配任何不在 character_group 中的单个字符。默认情况下,character_group 中的字符区分大小写。 [^aei] "v", "l" in "avail"
    [ first - last ] 字符范围:匹配从第一个到最后一个范围内的任何单个字符。 (\w+)\t "Name\t", "Addr\t" in "Name\tAddr\t"
    . 通配符:匹配除 \n 之外的任何单个字符。 a.e "ave" in "have" "ate" in "mate"
    \p{ name } 匹配 Unicode 通用类别或name指定的命名块中的任何单个字符。 \p{卢} "C", "L" in "City Lights"
    \P{ name } 匹配任何不在 Unicode 通用类别或name指定的命名块中的单个字符。 \P{Lu} "i", "t", "y" in "City"
    \w 匹配任何单词字符。 \w "R", "o", "m" and "1" in "Room#1"
    \W \W "#" in "Room#1"
    \s 匹配任何空白字符。 \w\s "D " in "ID A1.3"
    \S 匹配任何非空白字符。 \s\S " _" in "int __ctr"
    \d 匹配任何十进制数字。 \d "4" in "4 = IV"
    \D 匹配除十进制数字以外的任何字符。 \D " ", "=", " ", "I", "V" in "4 = IV"
  • 锚点

    锚允许匹配成功或失败取决于字符串中的当前位置。下表列出了锚点 -
    锚点 描述 模式 匹配
    ^ 匹配必须从字符串或行的开头开始。 ^\d{3} "567" in "567-777-"
    $ 匹配必须出现在字符串的末尾或之前 \n 在行或字符串的末尾。 -\d{4}$ "-2012" in "8-12-2012"
    \A 匹配必须出现在字符串的开头。 \A\w{3} "Code" in "Code-007-"
    \Z 匹配必须出现在字符串的末尾或字符串末尾的 \n 之前。 -\d{3}\Z "-007" in "Bond-901-007"
    \z 匹配必须出现在字符串的末尾。 -\d{3}\z "-333" in "-901-333"
    \G 比赛必须发生在上一场比赛结束的地方。 \\G\(\d\) "(1)", "(3)", "(5)" in "(1)(3)(5)[7](9)"
    \b 匹配必须发生在 \w(字母数字)和 \W(非字母数字)字符之间的边界上。 \w "R", "o", "m" and "1" in "Room#1"
    \B 比赛不得发生在 \b 边界。 \Bend\w*\b "ends", "ender" in "end sends endure lender"
  • 分组结构

    分组构造描述正则表达式的子表达式并捕获输入字符串的子字符串。下表列出了分组结构 -
    分组结构 描述 模式 匹配
    ( subexpression ) 捕获匹配的子表达式并为其分配一个从零开始的序数。 (\w)\1 "ee" in "deep"
    (?< name >subexpression) 将匹配的子表达式捕获到命名组中。 (?<double>\w)\k<double> "ee" in "deep"
    (?< name1 -name2 >subexpression) 定义平衡组定义。 ((((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(? !))$ "((1-3)*(3-1))" in "3+2^((1-3)*(3-1))"
    (?: subexpression) 定义一个非捕获组。 写(?:行)? "WriteLine" in "Console.WriteLine()"
    (?imnsx-imnsx:subexpression) 适用或禁用内指定的选项的子表达式 A\d{2}(?i:\w+)\b "A12xl", "A12XL" in "A12xl A12XL a12xl"
    (?= subexpression) 零宽度正向前瞻断言。 \ w + (? = \.) "is", "ran", and "out" in "He is. The dog ran. The sun is out."
    (?! subexpression) 零宽度负前瞻断言。 \b(?!un)\w+\b "sure", "used" in "unsure sure unity used"
    (?< =subexpression) 零宽度正向后视断言。 (?< =19)\d{2}\b "51", "03" in "1851 1999 1950 1905 2003"
    (?< ! subexpression) 零宽度负回顾断言。 (?< !19)\d{2}\b "ends", "ender" in "end sends endure lender"
    (?> subexpression) 非回溯(或“贪婪”)子表达式。 [13579](?>A+B+) "1ABB", "3ABB", and "5AB" in "1ABB 3ABBC 5AB 5AC"
  • 量词

    量词指定输入字符串中必须存在多少前一个元素(可以是字符、组或字符类)的实例才能发生匹配。
    "ran", "rain"
    量化 描述 图案 火柴
    * 匹配前一个元素零次或多次。 \d*\.\d ".0", "19.9", "219.9"
    + 匹配前一个元素一次或多次。 "be+" "bee" in "been", "be" in "bent"
    ? 匹配前一个元素零次或一次。 "rai?n" "ran", "rain"
    { n } 精确匹配前一个元素 n 次。 ",\d{3}" ",043" in "1,043.6", ",876", ",543", and ",210" in "9,876,543,210"
    { n ,} 匹配前一个元素至少 n 次。 "\d{2,}" "166", "29", "1930"
    { n , m } 匹配前一个元素至少 n 次,但不超过 m 次。 "\d{3,5}" "166", "17668" "19302" in "193024"
    *? 匹配前一个元素零次或多次,但尽可能少。 \d*?\.\d ".0", "19.9", "219.9"
    +? 匹配前一个元素一次或多次,但次数越少越好。 "be+?" "be" in "been", "be" in "bent"
    ?? 匹配前一个元素零次或一次,但尽可能少。 “雨” "rai??n"
    { n }? 正好匹配前面的元素 n 次。 ",\d{3}?" ",043" in "1,043.6", ",876", ",543", and ",210" in "9,876,543,210"
    { n ,}? 匹配前一个元素至少 n 次,但尽可能少。 “\d{2,}?” "\d{2,}?" "166", "29", "1930"
    { n , m }? 匹配 n 到 m 次之间的前一个元素,但尽可能少。 "\d{3,5}?" "166", "17668" "193", "024" in "193024"
  • 反向引用结构

    反向引用构造允许随后在同一正则表达式中识别先前匹配的子表达式。
    下表列出了这些结构 -
    反向引用结构 描述 模式 匹配
    \ number 反向引用。匹配编号子表达式的值。 (\w)\1 "ee" in "seek"
    \k< name > 命名反向引用。匹配命名表达式的值。 (?< char>\w)\k< char> "ee" in "seek"
  • 交替结构

    替代结构修改正则表达式以启用要么/或匹配。下表列出了交替结构 -
    交替构造 描述 模式 匹配
    | 匹配由竖线 (|) 字符分隔的任何一个元素。 th(e|is|at) "the", "this" in "this is the day. "
    (?( expression )yes | no ) 如果表达式匹配,则匹配yes;否则,匹配可选的no部分。表达式被解释为零宽度断言。 (?(A)A\d{2}\b|\b\d{3}\b) "A10", "910" in "A10 C103 910"
    (?( name )yes | no ) 如果命名的捕获名称匹配,则匹配yes;否则,匹配可选的no (?<quoted>")?(?(quoted).+?"|\S+\s) Dogs.jpg, "Yiska playing.jpg" in "Dogs.jpg "Yiska playing.jpg""
  • 替换

    替换用于替换模式。下表列出了替代品 - −
    字符 描述 模式 替换模式 输入字符串 结果字符串
    $number 替换与组号匹配的子串。 \b(\w+)(\s)(\w+)\b $3$2$1 "one two" "two one"
    ${name} 替换与命名groupname匹配的子字符串。 \b(?< word1>\w+)(\s)(?< word2>\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"
  • 杂项结构

    以下是各种杂项结构 - −
    构造 定义 例子
    (?imnsx-imnsx) 设置或禁用模式中间的不区分大小写等选项。 \bA(?i)b\w+\b matches "ABA", "Able" in "ABA Able Act"
    (?#comment) 行注释。注释在第一个右括号处结束。 \bA(?#Matches words starting with A)\w+\b
    # [to end of line] X 模式注释。注释以未转义的 # 开头,一直到行尾。 (?x)\bA\w+\b#Matches words starting with A
  • 正则表达式类

    Regex 类用于表示正则表达式。
    Regex 类具有以下常用方法 -
    序号 方法和说明
    1
    Public Function IsMatch (input As String) As Boolean
    指示在 Regex 构造函数中指定的正则表达式是否在指定的输入字符串中找到匹配项。
    2
    Public Function IsMatch (input As String, startat As Integer ) As Boolean
    指示在 Regex 构造函数中指定的正则表达式是否在指定的输入字符串中找到匹配项,从字符串中的指定起始位置开始。
    3
    Public Shared Function IsMatch (input As String, pattern As String ) As Boolean
    指示指定的正则表达式是否在指定的输入字符串中找到匹配项。
    4
    Public Function Matches (input As String) As MatchCollection
    在指定的输入字符串中搜索所有出现的正则表达式。
    5
    Public Function Replace (input As String, replacement As String) As String
    在指定的输入字符串中,用指定的替换字符串替换与正则表达式模式匹配的所有字符串。
    6
    Public Function Split (input As String) As String()
    在 Regex 构造函数中指定的正则表达式模式定义的位置将输入字符串拆分为子字符串数组。
    有关方法和属性的完整列表,请参阅 Microsoft 文档。
  • 示例 1

    以下示例匹配以“S”开头的单词 -
    
    Imports System.Text.RegularExpressions
    Module regexProg
       Sub showMatch(ByVal text As String, ByVal expr As String)
          Console.WriteLine("The Expression: " + expr)
          Dim mc As MatchCollection = Regex.Matches(text, expr)
          Dim m As Match
          
          For Each m In mc
             Console.WriteLine(m)
          Next m
       End Sub
       
       Sub Main()
          Dim str As String = "A Thousand Splendid Suns"
          Console.WriteLine("Matching words that start with 'S': ")
          showMatch(str, "\bS\S*")
          Console.ReadKey()
       End Sub
    End Module
    
    当上面的代码被编译和执行时,它会产生以下结果 -
    
    Matching words that start with 'S':
    The Expression: \bS\S*
    Splendid
    Suns
    
  • 示例 2

    以下示例匹配以“m”开头并以“e”结尾的单词 -
    
    Imports System.Text.RegularExpressions
    Module regexProg
       Sub showMatch(ByVal text As String, ByVal expr As String)
          Console.WriteLine("The Expression: " + expr)
          Dim mc As MatchCollection = Regex.Matches(text, expr)
          Dim m As Match
          
          For Each m In mc
             Console.WriteLine(m)
          Next m
       End Sub
       
       Sub Main()
          Dim str As String = "make a maze and manage to measure it"
          Console.WriteLine("Matching words that start with 'm' and ends with 'e': ")
          showMatch(str, "\bm\S*e\b")
          Console.ReadKey()
       End Sub
    End Module
    
    当上面的代码被编译和执行时,它会产生以下结果 -
    
    Matching words start with 'm' and ends with 'e':
    The Expression: \bm\S*e\b
    make
    maze
    manage
    measure
    
  • 示例 3

    这个例子替换了额外的空白 -
    
    Imports System.Text.RegularExpressions
    Module regexProg
       Sub Main()
          Dim input As String = "Hello    World   "
          Dim pattern As String = "\\s+"
          Dim replacement As String = " "
          Dim rgx As Regex = New Regex(pattern)
          Dim result As String = rgx.Replace(input, replacement)
          
          Console.WriteLine("Original String: {0}", input)
          Console.WriteLine("Replacement String: {0}", result)
          Console.ReadKey()
       End Sub
    End Module
    
    当上面的代码被编译和执行时,它会产生以下结果 -
    
    Original String: Hello   World   
    Replacement String: Hello World