excel VBA中的正则表达式

时间:2015-10-23 13:58:41

标签: regex vba excel-vba excel

我正在尝试在excel VBA中使用正则表达式来匹配列范围内所有单元格中的模式,并将匹配的模式移除到新的列范围。

E.g。

  1. 快乐日间护理俱乐部(1124734)
  2. French Pattiserie(8985D)
  3. The King's Pantry(G6666642742D)
  4. 大鞋(中国)有限公司(ZZ454)
  5. 基本上我想删除每个字符串的最后一个括号内部分并将此部分(不带括号)转换到不同的列范围内。

    我到目前为止的正则表达式是“(([^]] +))\ 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
    

    我是新手所以请原谅明显的错误。

    非常感谢,

3 个答案:

答案 0 :(得分:2)

没有你的正则表达式模式是不正确的。您应该单独测试您的模式,因为正则表达式是它自己的迷你语言。试试这种模式(Regex101):

\((.+)\)$

关于gm选项:g表示Globalm表示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))。您需要进行质量检查以处理没有适当格式的数据。