regex UDF(正则表达式),用于匹配带有一些排除项的字符串变体

cbwuti44  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(102)

我需要在字符串Mod*上使用(正则表达式),后跟一个特定的字符,例如"A",如下所示:
Mod AMod_AModule xx AModules (A & B)等等。
但是,有以下条件:

  • (1)-如果单元格包含(Modif*Moder*Modr*)和Mod*中的任何一个加上我的特定字符,则结果为True*
  • (2)-如果单元格包含(Modif*Moder*Modr*)中的任何一个而不是Mod*加上我的特定字符,则结果为False*

请将此示例和预期结果:
| * * 项目说明**|* * RegexMatch的预期结果**|
| - ------|- ------|
| 模块A1的新修改|正确|
| 模A的一种新的改进|正确|
| mod_A新温和派|正确|
| 至模块(A和B)|正确|
| 新改良和中度A1|错误|
| A的新变体|错误|
| 修改的新中度|错误|
| 至模块(D & E)|错误|

Public Function RegexMatch(str) As Boolean
  Dim tbx2 As String:  tbx2 = "A"   'ActiveSheet.TextBox2.Value
    Static re As New RegExp
      re.Pattern = "\b[M]od(?!erate).*\b[" & tbx2 & "]\b"
       re.IgnoreCase = True
         RegexMatch = re.Test(str)
End Function

在此先感谢您的帮助。

6tqwzwtp

6tqwzwtp1#

不确定我是否正确理解了您的要求:您需要包含以“mod”开头的单词的行,但以“Modif”、“Moder”或“Modr”开头的单词不算在内。此外,需要存在模块 * 字符 *(例如“A”)。
当我看到更长的正则表达式术语时,我通常会感到头晕,所以我尝试编写一些代码行来代替。下面的函数用空格替换了“(“或“_”等特殊字符,将字符串拆分成单词,并逐字检查内容。易于理解,易于适应:

Function CheckModul(s As String, modulChar As String) As Boolean
    Dim words() As String
    words = Split(replaceSpecialChars(s), " ")
    
    Dim i As Long, hasModul As Boolean, hasModulChar As Boolean
    For i = 0 To UBound(words)
        Dim word As String
        word = UCase(words(i))
        If word Like "MOD*" _
        And Not word Like "MODIF*" _
        And Not word Like "MODER*" _
        And Not word Like "MODR*" Then
            hasModul = True
        End If
        If word = modulChar Then
            hasModulChar = True
        End If
    Next
    CheckModul = hasModul And hasModulChar
End Function

Function replaceSpecialChars(ByVal s As String) As String
    Dim i As Long
    replaceSpecialChars = s
    For i = 1 To Len(replaceSpecialChars)
        If Mid(replaceSpecialChars, i, 1) Like "[!0-9A-Za-z]" Then Mid(replaceSpecialChars, i) = " "
    Next
End Function

使用您的数据作为UDF进行测试:

相关问题