【问题标题】:VBA regex: extract multiple strings between strings within Excel cell with custom functionVBA正则表达式:使用自定义函数在Excel单元格中的字符串之间提取多个字符串
【发布时间】:2021-09-21 18:03:44
【问题描述】:

在 Excel 列中,我有如下数据:

“奥迪 (ADI)、梅赛德斯 (modelx) (MEX)、法拉利超快、高 PS (FEH)”

有数百种型号由名称和括号中三个大写字母的缩写来描述。

我只需要提取名称和缩写词来分隔单元格。我通过以下模块成功地为缩写词做这件事

Function extrABR(cellRef) As String
    Dim RE As Object, MC As Object, M As Object
    Dim sTemp As Variant
    Const sPat As String = "([A-Z][A-Z][A-Z][A-Z]?)"  ' this is my regex to match my string
    
    
Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .MultiLine = True
    .Pattern = sPat
    If .Test(cellRef) Then
        Set MC = .Execute(cellRef)
        For Each M In MC
            sTemp = sTemp & ", " & M.SubMatches(0)
        Next M
    End If
End With

extrABR = Mid(sTemp, 3)

End Function 

但是,我无法为名称这样做。我想只用以下正则表达式交换正则表达式:(^(.*?)(?= \([A-Z][A-Z][A-Z])|(?<=, )(.*)(?= \([A-Z][A-Z][A-Z])),但 VBA 似乎不允许向后看。

有什么想法吗?

【问题讨论】:

  • 你会得到一个带有"\([^)]+\)"的缩写集合...并且用第二个匹配替换所有那些用“”,你会得到一个没有缩写的字符串,然后你可以将其拆分为名称。跨度>
  • 你的意思是需要获取AudiMercedes (modelx)Ferrari super fast, high PS组成的数组吗?

标签: excel regex vba function lookbehind


【解决方案1】:

正确,不支持后视,但仅当您的预期匹配重叠时才需要它们。这里不是这种情况,你所有的匹配都是不重叠的。所以,你可以再次依赖捕获

(?:^|,)\s*(.*?)(?=\s*\([A-Z]{3,}\))

请参阅regex demo。第 1 组值通过.Submatches(0) 访问。

详情

  • (?:^|,) - 字符串或逗号的开头
  • \s* - 零个或多个空白字符
  • (.*?) - 捕获组 1:尽可能少的除换行符以外的任何零个或多个字符
  • (?=\s*\([A-Z]{3,}\)) - 与紧随其后的位置匹配的正向前瞻
    • \s* - 零个或多个空白字符
    • \( - 一个 ( 字符
    • [A-Z]{3,} - 三个或更多大写字符
    • \) - 一个 ) 字符。

演示截图:

【讨论】:

  • 很高兴学习这个.. 可能是 OP 期望括号之间最多有 4 个大写字母。那么我们可以将([A-Z]{3,} 替换为([A-Z]{4,} 并匹配3 或4 个大写字母吗?
  • @Naresh 要匹配三个或四个,应使用[A-Z]{3,4}
  • 知道了.. 谢谢。我只是看看this docs.microsoft.com page
【解决方案2】:

RE.REPLACE -- 试试这个函数.. 括号之间的任何内容都将被替换为 "" 只给你模型名称的字符串,然后你可以用逗号分割并根据需要获取字符串数组。

Function ModelNames(cellRef) As String
    Dim RE As Object, MC As Object, M As Object
    Dim sTemp As Variant, sPat As String
    sPat = "\([^)]+\)"
'Or you can use your formula pattern "([A-Z][A-Z][A-Z][A-Z]?)" to get (modelx)  in the final output.

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .MultiLine = True
    .Pattern = sPat
End With

ModelNames = RE.Replace(cellRef, "")

End Function

【讨论】:

    猜你喜欢
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2012-05-30
    • 2014-06-12
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多