我正在尝试在excel VBA中使用正则表达式来匹配列范围内所有单元格中的模式,并将匹配的模式移除到新的列范围。
E.g。
基本上我想删除每个字符串的最后一个括号内部分并将此部分(不带括号)转换到不同的列范围内。
我到目前为止的正则表达式是“(([^]] +))\ z”(我不知道这是否真的正确),并且嵌入在这个VBA中:
Dim regEx As New RegExp
Dim strPattern As String
Dim strInput As String
Dim strReplace As String
Dim Myrange As Range
Sheets("Sheet 1").Activate
Range("FF65536").End(xlUp).Select
LastCell = ActiveCell.Address
Set Myrange = ActiveSheet.Range("FF2:" & LastCell)
For Each C In Myrange
strPattern = "(\(([^\)]+)\)\z)"
If strPattern <> "" Then
strInput = C.Value
strReplace = "$1"
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.Test(strInput) Then
Range("FF2").Select = regEx.Replace(strInput, "$1")
Range("DX2").Select = regEx.Replace(strInput, "$2")
End If
End If
Next
我是新手所以请原谅明显的错误。
非常感谢,
答案 0 :(得分:2)
没有你的正则表达式模式是不正确的。您应该单独测试您的模式,因为正则表达式是它自己的迷你语言。试试这种模式(Regex101):
\((.+)\)$
关于gm
选项:g
表示Global
,m
表示Multiline
,两者都在您的代码中设置为True
答案 1 :(得分:0)
这是一种非RegEx方法:
{{1}}
答案 2 :(得分:0)
就个人而言,我会选择RegEx作为最后的手段......
以下是使用字符串函数的代码段:
Dim iRow As Long
Dim s As String
For iRow = 1 To UsedRange.Rows.Count
Debug.Print Cells(iRow, 1).Value
s = Cells(iRow, 1).Value
s = Trim(Left(s, InStrRev(s, "(") - 1))
Debug.Print s
Next
相关行为Trim(Left(s, InStrRev(s, "(") - 1))
。您需要进行质量检查以处理没有适当格式的数据。