gpt4 book ai didi

正则表达式 Visual Basic UDF 未按预期执行

转载 作者:行者123 更新时间:2023-12-02 11:52:32 26 4
gpt4 key购买 nike

我正忙于 VB 的正则表达式,但我似乎找不到我哪里出错了。

示例:

模式:(?<=\d{10,11})(.|[\r\n])*(?=移动版)

输入:6578543567 我要保留的文字移动操作

输出:#Name?

  • 列出项目

该号码由 10 和 11 位电话号码组成。我想要保留的文本长度各不相同。文本始终位于“Mobile”一词之前。

Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant
Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp
Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object
Dim replaceNumber As Integer

With inputRegexObj
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = matchPattern
End With
With outputRegexObj
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "\$(\d+)"
End With
With outReplaceRegexObj
.Global = True
.MultiLine = True
.IgnoreCase = False
End With

Set inputMatches = inputRegexObj.Execute(strInput)
If inputMatches.count = 0 Then
regex = False
Else
Set replaceMatches = outputRegexObj.Execute(outputPattern)
For Each replaceMatch In replaceMatches
replaceNumber = replaceMatch.SubMatches(0)
outReplaceRegexObj.Pattern = "\$" & replaceNumber

If replaceNumber = 0 Then
outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value)
Else
If replaceNumber > inputMatches(0).SubMatches.count Then
'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "."
regex = CVErr(xlErrValue)
Exit Function
Else
outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1))
End If
End If
Next
regex = outputPattern
End If
End Function

最佳答案

IIRC,VBA 在其正则表达式实现中不支持环视。

但是,这似乎是一个相对容易匹配的字符串。您有一组连续的数字,后跟一个空格,然后您想要匹配直到“Mobile”一词为止的未公开数量的单词。

您可以使用以下模式来完成此操作:

\d+\s(.*?)\sMobile

详细信息 (See it in action here) :

  • \d 任意数字
    • + (量词) 一到无限次 - 贪婪
  • \s 单个空白字符
  • (...) 捕获组来抓取要返回的文本
  • . 任意字符
    • *? (量词) 零到无限次 - 懒惰
  • \s 单个空白字符
  • Mobile 字面意思与“Mobile”一词匹配

贪婪量词与惰性量词有什么关系?

第一个量词+贪婪。是什么让这个人如此贪婪?紧随该量词之后缺少 ? 使其变得贪婪。这本质上是它会消耗尽可能多的\d

由于我们在该语句末尾添加了 \s,这不会真正改变结果,因为无论如何它都必须匹配所有数字才能到达该空间 \s。但是,如果您决定要捕获 (...) 空间并删除了 \s,那么这将很重要 - 因为您的 .*如果这是懒惰的话, ? 将消耗除一个数字之外的所有数字\d

那么,为什么我们要在 .* 中使用惰性量词? 那么,如果您的输入字符串包含两个表示 Mobile,贪婪量词会使用第一个单词并匹配直到第二个单词。如果您只想匹配 Mobile 的第一个单词,那么您需要让它变得懒惰。

最后 - 现在我如何检索捕获组(...)中的文本?

使用 VBA,您可以使用 Matches 对象。首先,我建议进行测试以确保存在匹配 - 这可以通过简单的 If...Then 语句来完成。一旦测试通过,您就可以安全地获取返回值。

With New RegExp
.Pattern = "\d+\s(.*?)\sMobile"
.IngoreCase = True 'If your 'Mobile' word can be any case, switch to false
If .Test(inputString) Then
retVal = .Execute(inputString)(0).SubMatches(0)
End If
End With
  • inputString 将是包含测试值的字符串。
  • retVal 是从捕获组返回的值。

关于正则表达式 Visual Basic UDF 未按预期执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43828507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com