我正在尝试使用正则表达式来匹配令牌。到目前为止,我有
\{[0-2]\}
在字符串中查找{0}
,{1}
和{2}
的所有实例。我想确保每个字符串在给定的字符串中至少出现一次。我可以只计算正则表达式的结果并验证每个结果,但是我想知道是否可以直接在正则表达式中做到这一点?
示例
"{0}{1}{2}" - True
"{1}{0}{2}" - True (rearrangement)
"{1}{0}{2}{2}" - True (repetition fine)
"foo{1}bar{0}blah{2}" - True
"foo{2}bar{0}blah{2}" - False (no {1})
"foo{2}bar{0}blah{12}" - False (no {1})
答案 0 :(得分:1)
我将通过单独检查是否存在每个令牌来做到这一点:
\{1\}
\{2\}
\{3\}
,然后将它们组合成一个连词(AND
)。
答案 1 :(得分:1)
您可以为此使用提前条件:
(?=.*\{0\})(?=.*\{1\})(?=.*\{2\})
第一个(?=.*\{0\})
条件将尝试匹配字符串中某个位置的{0},而不会消耗该字符串 ,然后(?=.*\{1\})
将尝试匹配{1} 从字符串的开头再次开始,等等。
注意:在第一个预读条件中,.*
并不是严格必要的,因为您不一定从字符串的开头就进行匹配,但是出于对称性的原因,我将其包括在内...
答案 2 :(得分:1)
我担心RegExps不适合您的用例,因为它们比诸如以下的更直接的方法更不易维护且速度较慢:
Function AllInStr(str As String, tokens() As String) As Boolean
AllInStr = True
Dim token As Variant
For Each token In tokens
AllInStr = AllInStr And InStr(str, token) <> 0
If Not AllInStr Then Exit Function
Next
End Function
通过此测试用例验证:
Sub test()
Dim tokens() As String
tokens = Split("{0} {1} {2}")
Debug.Assert AllInStr("{0}{1}{2}", tokens)
Debug.Assert AllInStr("{1}{0}{2}", tokens)
Debug.Assert AllInStr("{1}{0}{2}{2}", tokens)
Debug.Assert AllInStr("foo{1}bar{0}blah{2}", tokens)
Debug.Assert Not AllInStr("foo{2}bar{0}blah{2}", tokens)
Debug.Assert Not AllInStr("foo{2}bar{0}blah{12}", tokens)
End Sub