正则表达式以确保范围内的每个数字都匹配一次

时间:2018-11-23 16:12:30

标签: regex excel vba

我正在尝试使用正则表达式来匹配令牌。到目前为止,我有

\{[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})

3 个答案:

答案 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