使用正则expression式提取括号数据

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

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 

例如:

在这里输入图像说明

我现在试图用一些正则expression式来代替它。 我不是一个正则expression式专家。 我想创build一个模式,查找一个开放的括号,然后是零个或多个任意types的字符,然后是一个紧的括号。 我想出了:

 \((.+?)\) 

我目前的新代码是:

 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 

代码至less有两个问题:

  • 它只会得到string中的第一个匹配。 (Mcoll.Count总是1)
  • 它不会识别括号之间的零字符。 (我认为。+?至less需要一个字符)

有没有人有什么build议 ??

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

至于正则expression式,尽可能less地匹配零个或多个字符,你需要*? ,不是+? 。 请注意,两者都是懒惰的 (匹配尽可能less的来find有效的匹配),但+需要至less一个字符,而*允许匹配零字符(一个空string)。

因此,使用

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

至于正则expression式,你也可以使用

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

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