RegEx для сопоставления форвардных упражнений - PullRequest
4 голосов
/ 03 мая 2019

Я работаю над упражнением на прямую ссылку на регулярное выражение, как тот, который был задан здесь

Задача:

  • string s состоит из тик или тас
  • тик не должен быть непосредственным соседом сам по себе
  • Первый тик должно произойти, только если tac появилось хотя бы дважды до

Я использовал это regex для его решения.Но он не использует forward reference, поэтому я действительно хочу знать, как это можно решить, используя его.

^tac(tac)+(tic(tac)+){0,}(tic)?$

Действительный :

tactactic
tactactictactic

Invalid :

tactactictactictictac
tactictac

Как мне решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 03 мая 2019

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

^tac(tac(?:tic)?)+$

Пояснение:

  • ^tac - начало строки с tac
  • (tac(?:tic)?)+ - Это соответствует tac, за которым, возможно, следует tic, из-за чего два tic никогда не будут встречаться вместе, а поскольку tic здесь необязательно, следовательно, оно позволяет сопоставить tac столько, сколько время, необходимое для соответствия шаблону.
  • $ - конец строки

Regex Demo

2 голосов
/ 03 мая 2019

Используется прямая ссылка:

^(\2tic|(tac))+$

Демо

Это на самом деле очень похоже на пример, приведенный на этой странице .

2 голосов
/ 03 мая 2019

Если в строке должно быть как минимум 2 тика, вы можете использовать отрицательный прогноз, чтобы утверждать, что тикса нет, и начать с сопоставления и, как минимум, 2 раза tic

^(?!.*tictic)(?:tac){2}tic(?:t[ai]c)*$

Regex demo

Если строка также может состоять только из 1 или более тактов, вы можете использовать чередование:

^(?:(?:tac)+|(?!.*(tictic))(?:tac){2,}tic(?:t[ia]c)*)$
  • ^ Начало строки
  • (?: Группа без захвата
    • (?:tac)+ Повторить 1+ раз только так
    • | или
    • (?!.*(tictic)) Утверждение, что справа не содержит такта
    • (?:tac){2,}(?:t[ia]c)* Повторите 2+ раза tac, затем tic и повторяйте tic или tac 0+ раз до конца строки
  • ) Закрыть группу без захвата
  • $ Конец строки

Regex demo

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