我有一个小子,它从字符串中提取括号数据(包括括号)并将其存储在与字符串相邻的单元格中:
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
例如:
我现在正试图用一些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
代码至少有两个问题:
有没有人有任何建议?
答案 0 :(得分:1)
默认情况下,RegExp 全局属性为 False 。您需要将其设置为 True 。
对于正则表达式,要尽可能少地匹配零个或多个字符,您需要*?
,而不是+?
。请注意,两者都是 lazy (匹配少量以找到有效匹配),但+
至少需要一个字符,而*
允许匹配零字符(空字符串)。
因此,请使用
Set regex = New RegExp
regex.Global = True
regex.Pattern = "\((.*?)\)"
至于正则表达式,您也可以使用
regex.Pattern = "\(([^()]*)\)"
其中[^()]
是否定字符类,匹配任何字符(
和)
,零次或多次(由于*
量词),匹配尽可能多的这样的字符(*
是一个贪婪的量词)。