使用Regex提取括号数据

时间:2016-10-30 20:45:25

标签: regex excel excel-vba vba

我有一个小子,它从字符串中提取括号数据(包括括号)并将其存储在与字符串相邻的单元格中:

Sub parens()
    Dim s As String, i As Long
    Dim c As Collection
    Set c = New Collection

    s = ActiveCell.Value
    ary = Split(s, ")")
    For i = LBound(ary) To UBound(ary) - 1
        bry = Split(ary(i), "(")
        c.Add "(" & bry(1) & ")"
    Next i

    For i = 1 To c.Count
        ActiveCell.Offset(0, i).NumberFormat = "@"
        ActiveCell.Offset(0, i).Value = c.Item(i)
    Next i

End Sub

例如:

enter image description here

我现在正试图用一些Regex代码替换它。我不是正则表达式专家。我想创建一个模式,查找一个左括号,后跟零个或多个任何类型的字符,后跟一个右括号。 我提出了:

\((.+?)\)

我目前的新代码是:

Sub qwerty2()

    Dim inpt As String, outpt As String
    Dim MColl As MatchCollection, temp2 As String
    Dim regex As RegExp, L As Long

    inpt = ActiveCell.Value
    MsgBox inpt
    Set regex = New RegExp
    regex.Pattern = "\((.+?)\)"
    Set MColl = regex.Execute(inpt)
    MsgBox MColl.Count
    temp2 = MColl(0).Value
    MsgBox temp2

End Sub

代码至少有两个问题:

  • 它只会获得字符串中的第一个匹配。(Mcoll.Count始终为1)
  • 它不会识别括号之间的零字符。 (我认为。+?至少需要一个字符)

有没有人有任何建议?

1 个答案:

答案 0 :(得分:1)

默认情况下,RegExp 全局属性为 False 。您需要将其设置为 True

对于正则表达式,要尽可能少地匹配零个或多个字符,您需要*?,而不是+?。请注意,两者都是 lazy (匹配少量以找到有效匹配),但+至少需要一个字符,而*允许匹配零字符(空字符串)。

因此,请使用

Set regex = New RegExp
regex.Global = True
regex.Pattern = "\((.*?)\)"

至于正则表达式,您也可以使用

regex.Pattern = "\(([^()]*)\)"

其中[^()]否定字符类,匹配任何字符(),零次或多次(由于*量词),匹配尽可能多的这样的字符(*是一个贪婪的量词)。