Estou procurando uma função regex que corresponda exatamente a essas variantes de "SA..." (SAC, SAD, SAE, SAP, SAW, SAAC, SAAN, SAAS, SABE, SABW ), mas sem diferenciar maiúsculas de minúsculas.
O problema é que pode haver um ou mais separadores (espaço, barra invertida /, ponto, hífen -) entre cada caractere de cada palavra, por exemplo, "S /AC", "SA.P", "S / AB W".
Acabei com o padrão abaixo; sim, funciona, mas é feio e muito longo!
Existe um melhor e mais compacto?
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
Você precisa fatorar seu padrão regex:
Veja a demonstração do regex onde você pode testá-lo em suas strings de amostra.
Basicamente, todas as alternativas são "mescladas" em uma regex TRIE aqui: começamos com o prefixo comum e então usamos ramificações para corresponder a todas as variações de sufixo esperadas.
O padrão base aparece como
\bSA(?:A[CNS]|B[EW]|[C-EPW])\b
, que corresponde a um limite de palavra, o prefixo comumSA
,A
seguido porC
,N
ouS
, ouB
seguido porE
ouW
, ouC
,D
,E
,P
ouW
, e então um limite de palavra.Para permitir um separador entre cada letra, basta inseri-lo e o padrão ficará como
\bS[ ./-]*A[ ./-]*(?:A[ ./-]*[CNS]|B[ ./-]*[EW]|[C-EPW])\b
.