我试图用正则表达式精确匹配“SA..”的这些变体(SAC、SAD、SAE、SAP、SAW、SAAC、SAAN、SAAS、SABE、SABW),但不区分大小写。
问题是每个单词的每个字符之间可能存在一个或多个分隔符(空格、反斜杠 /、点 . 、连字符 -),例如“ S /AC”、“SA.P”、“S / AB W”。
我最终得到了下面的模式,是的,它有效,但它很丑而且很长!:
有没有更好更紧凑的模式?
Option Explicit
Option Compare Text
Function MatchSAWord(ByVal inputText As String) As Boolean
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
Dim sep As String, pat As String
sep = "[ .\/-]*"
pat = "\b(" & _
"S" & sep & "A" & sep & "C" & "|" & _
"S" & sep & "A" & sep & "D" & "|" & _
"S" & sep & "A" & sep & "E" & "|" & _
"S" & sep & "A" & sep & "P" & "|" & _
"S" & sep & "A" & sep & "W" & "|" & _
"S" & sep & "A" & sep & "A" & sep & "C" & "|" & _
"S" & sep & "A" & sep & "A" & sep & "N" & "|" & _
"S" & sep & "A" & sep & "A" & sep & "S" & "|" & _
"S" & sep & "A" & sep & "B" & sep & "E" & "|" & _
"S" & sep & "A" & sep & "B" & sep & "W" & _
")\b"
With regex
.Global = False
.IgnoreCase = True
.pattern = pat
End With
MatchSAWord = regex.Test(inputText)
End Function
您需要分解您的正则表达式模式:
请参阅正则表达式演示,您可以在其中根据示例字符串对其进行测试。
基本上,所有替代方案都在这里“合并”到正则表达式 TRIE 中:我们从公共前缀开始,然后使用分支来匹配所有预期的后缀变体。
基本模式显示为
\bSA(?:A[CNS]|B[EW]|[C-EPW])\b
,与单词边界匹配,公共前缀SA
,然后A
是C
,N
或S
,或者B
后跟E
或W
,或 ,或C
,然后是D
,或E
,P
或W
,然后是单词边界。为了允许每个字母之间有分隔符,只需插入它,模式将看起来像
\bS[ ./-]*A[ ./-]*(?:A[ ./-]*[CNS]|B[ ./-]*[EW]|[C-EPW])\b
。