Excel VBA 正则表达式函数将多个匹配项返回到单个单元格中

Boo*_*718 3 regex excel vba

我需要帮助让我的 Excel 函数正常工作。目标是运行一个单元格内函数,将正则表达式函数的所有模式匹配从另一个单元格的输入提取到一个单元格中,而不是单元格数组中。

我已经尝试使用一个数组,该数组在函数对话框预览中返回两个匹配项,但仅输出单元格中的第一个匹配项。我也尝试过使用集合,但没有成功。

这是我当前的代码和将用作函数字符串输入的文本示例:

Function RegexMatches(strInput As String) As Variant

Dim rMatch As Match
Dim arrayMatches
Dim i As Long

arrayMatches = Array()

With New RegExp
    .Global = True
    .MultiLine = True
    .IgnoreCase = True
    .Pattern = "(Code)[\s][\d]{2,4}"
        For Each rMatch In .Execute(strInput)
        ReDim Preserve arrayMatches(i)
        arrayMatches(i) = rMatch.Value
        i = i + 1
    Next
End With

    RegexMatches = arrayMatches
End Function
Run Code Online (Sandbox Code Playgroud)


来自 Excel 单元格的 strInput 示例:

代码 123 一些随机文本
出现在此处并继续到下一行
代码 4567 后跟更多文本
,包括新行,而不仅仅是换行文本



该函数所需的输出将是正则表达式函数中的两个 (2) 匹配值到单个单元格中(例如“代码 123 代码 4567”)。

任何帮助是极大的赞赏!

SJR*_*SJR 6

看起来您错过了函数的结尾(根据 Mat's Mug 的评论)?试试这个(根据 Wiktor 的评论)。

编辑:根据 Mat 的马克杯的建议进行修改。

Function RegexMatches(strInput As String) As String

Dim rMatch As Object
Dim s As String
Dim arrayMatches()
Dim i As Long

With New RegExp
    .Global = True
    .MultiLine = True
    .IgnoreCase = True
    .Pattern = "(Code)[\s][\d]{2,4}"
    If .test(strInput) Then
        For Each rMatch In .Execute(strInput)
            ReDim Preserve arrayMatches(i)
            arrayMatches(i) = rMatch.Value
            i = i + 1
            's = s & " " & rMatch
        Next
    End If
End With

RegexMatches = Join(arrayMatches, " ")

End Function
Run Code Online (Sandbox Code Playgroud)

  • 没什么——这个函数是由细胞调用的这一事实让我困惑不解;在返回之前加入并返回一个“String”,正是 OP 所需要的 =) 如果它只是一个普通函数,那么它负责匹配和字符串表示将违反 SRP IMO。 (2认同)