使用正则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 = "\(([^()]*)\)"
其中[^()]
是匹配任何字符但(
和)
的否定字符类 ,零次或多次(由于*
量词)匹配尽可能多的字符( *
是一个贪婪的量词)。