在Excel VBA中的正则表达式

3
我正在尝试在Excel VBA中使用正则表达式来匹配列范围内所有单元格中的模式,并将匹配的模式移动到新的列范围中。
例如:
1. Happy Day Care Club (1124734) 2. French Pattiserie (8985D) 3. The King's Pantry (G6666642742D) 4. Big Shoe (China) Ltd (ZZ454)
基本上,我想要删除每个字符串的最后一个括号内的部分,并将此部分(不带括号)转置到不同的列范围中。
我目前有的正则表达式是"(([^)]+))\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

我是新手,请原谅我可能出现的明显错误。

非常感谢!


1
如果模式相同,就像括号部分总是在末尾,你可以使用split函数。这样可以用更少的代码实现相同的功能。 - Scott Craner
如果括号内包含 (),您也可以使用 \s*(\((.*?)\))$ 正则表达式。 - Wiktor Stribiżew
3个回答

2

你的正则表达式模式不正确。由于正则表达式是一种独立的小语言,因此您应该单独测试模式。尝试使用此模式(Regex101):

\((.+)\)$

关于gm选项:其中g代表全局匹配,m代表多行模式,这两个选项在你的代码中被设为True

0
这是一个非正则表达式的方法:
Dim Myrange As Range

Sheets("Sheet 1").Activate

Set Myrange = ActiveSheet.Range("FF2:FF" & Cells(Rows.Count, "FF").End(xlUp).Row)
With Myrange
    .Offset(, -43).Value = .Worksheet.Evaluate("INDEX(SUBSTITUTE(TRIM(RIGHT(SUBSTITUTE(" & .Address & _
                                            ",""("",REPT("" "",500)),500)),"")"",""""),)")
End With

0

个人而言,我会把正则表达式作为最后的手段...

这里是一个使用字符串函数的片段:

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))。您需要进行QA检查以处理没有正确格式的数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接