我是vba正则表达式的新手,我需要在一个非常大的报告中找到字段,其中文本字段或文本单元格中的文本包含3个或更多出现以下模式:
使用vba正则表达式“提交报告”或“提交的报告”或“提交代表”或“重新提交的代表”或“重新提交报告”,不区分大小写。
我无法弄清楚正则表达式和条件计数,因此可以将其调整为2,3或更多。
非常感谢任何指导。
答案 0 :(得分:0)
我不确定如何使用RegEx实现这一目标,以下肯定不是解决问题的最佳方法。但它确实可以解决问题。希望这会有所帮助:
Option Compare Text
Public Sub SearchForMultipleOccurencesOfReport()
Dim bolFoundSomehing As Boolean
Dim strLargeReport As String
Dim lngCounter As Long
Dim lngLooper As Long
Dim z As Variant
intCounter = 0
strLargeReport = "This is the text of your large report containing all these searched terms like submit report, submitting rep, or resubmitting report."
For lngLooper = 1 To 100000
bolFoundSomehing = False
z = InStr(1, strLargeReport, "submit report")
If IsNumeric(z) And z > 0 Then
lngCounter = lngCounter + 1
bolFoundSomehing = True
strLargeReport = Mid(strLargeReport, InStr(1, strLargeReport, "submit report") + Len("submit report"))
End If
z = InStr(1, strLargeReport, "submitted report")
If IsNumeric(z) And z > 0 Then
lngCounter = lngCounter + 1
bolFoundSomehing = True
strLargeReport = Mid(strLargeReport, InStr(1, strLargeReport, "submitted report") + Len("submitted report"))
End If
z = InStr(1, strLargeReport, "submitting rep")
If IsNumeric(z) And z > 0 Then
lngCounter = lngCounter + 1
bolFoundSomehing = True
strLargeReport = Mid(strLargeReport, InStr(1, strLargeReport, "submitting rep") + Len("submitting rep"))
End If
z = InStr(1, strLargeReport, "resubmitted rep")
If IsNumeric(z) And z > 0 Then
lngCounter = lngCounter + 1
bolFoundSomehing = True
strLargeReport = Mid(strLargeReport, InStr(1, strLargeReport, "resubmitted rep") + Len("resubmitted rep"))
End If
z = InStr(1, strLargeReport, "resubmitting report")
If IsNumeric(z) And z > 0 Then
lngCounter = lngCounter + 1
bolFoundSomehing = True
strLargeReport = Mid(strLargeReport, InStr(1, strLargeReport, "resubmitting report") + Len("resubmitting report"))
End If
If bolFoundSomehing = False Then Exit For
Next lngLooper
MsgBox "Found " & lngCounter & " occurences of the searched terms in the report."
End Sub
答案 1 :(得分:0)
我根本不熟悉VBA,或者VBA如何处理RegEx的细节,但此RegEx应该与您在问题中提到的所有术语相匹配:
/(?:re)?submit(?:ted|ting)? rep(?:ort)?/i
这将匹配您提到的任何字符串的一个实例。您可以使用RegEx子例程或递归来匹配此模式的多个实例,但我不知道VBA是否支持这些。这是一个丑陋但功能性的解决方案:
/(?:re)?submit(?:ted|ting)? rep(?:ort)?.+?(?:re)?submit(?:ted|ting)? rep(?:ort)?/i
这与上面重复两次的RegEx相同,它们之间有.+?
。这将使RegEx匹配您正在寻找的短语的第一个和第二个实例之间的任何和所有字符。如果匹配,则表示文本中有至少该短语的两个实例。