Регулярное выражение, чтобы убедиться, что каждое число в диапазоне сопоставляется один раз - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь сопоставить токены с помощью регулярных выражений.Пока у меня есть

\{[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 голосов
/ 23 ноября 2018

Для этого можно использовать предварительные условия:

(?=.*\{0\})(?=.*\{1\})(?=.*\{2\})

Первое (?=.*\{0\}) условие будет пытаться найти соответствие {0} где-то в вашей строке, без использования строки затем (?=.*\{1\}) будет пытаться сопоставить {1} , начиная с начала строки и т. д.

Примечание: .* в первом условии предварительного просмотра не являетсястрого необходимо, так как вы не обязательно соответствуете с начала строки, но я включил его по соображениям симметрии ...

0 голосов
/ 23 ноября 2018

Боюсь, что 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
0 голосов
/ 23 ноября 2018

Я бы сделал это, проверив отдельно наличие каждого токена:

\{1\}
\{2\}
\{3\}

и затем составив его в соединение (AND).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...