Regex отрицательные взгляды - PullRequest
0 голосов
/ 27 марта 2020

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

Some text {word1} some more text {word2} maybe some more text

Строка начинается с некоторого текста, затем следует {word1} (включая фигурные скобки), затем следует дополнительный текст, за которым следует {word2} (включая фигурные скобки) и, возможно, некоторый окончательный текст. Предложение должно содержать как {word1}, так и {word2}, оно должно иметь {word1} перед {word2}, и оба {word1} и {word2} могут появляться только один раз в предложении.

I У меня много проблем с созданием регулярных выражений для этого, в основном из-за негативных взглядов. Я хотел посмотреть, действительно ли кто-нибудь здесь действительно хорош с регулярным выражением и сможет ли создать регулярное выражение, чтобы проверить это. Ниже также приведены некоторые примеры текста, который не должен проходить .

Some text (no word1 or word2)
Some text {word1} some more text (no word2)
Some text {word2} some more text (no word1)
Some text {word1} some more text {word1} some more text {word2} maybe some more text (word1 appears multiple times)
Some text {word2} some more text {word1} maybe some more text (word2 precedes word1)
{word1} some text {word2} maybe some more text (no text preceding word1)
Some text {word1} {word2} maybe some more text (no text between word1 and word2)

Следует отметить, что хотя я использую word1 и word2, я специально не использую эти слова в регулярном выражении Это могут быть произвольные слова, но не одно и то же. Так, например, word1 может быть «яблоком», а word2 может быть «бананом».

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 27 марта 2020

Довольно сложно, но я думаю, что регулярное выражение содержит некоторые компоненты:

  1. Проверка текста до {word1}:

    ^\s*((?!\{word[12]\})\S)+((?!\{word[12]\}).)*

  2. Проверка текста {word1}:

    \{word1\}

  3. Проверка текста после {word1} и до {word2}:

    \s*((?!\{word[12]\})\S)+((?!\{word[12]\}).)*

  4. Проверка текста {word2}:

    \{word2\}

  5. Проверка текста после {word2} до конца :

    ((?!\{word[12]\}).)*$

Полное регулярное выражение:

^\s*((?!\{word[12]\})\S)+((?!\{word[12]\}).)*\{word1\}\s*((?!\{word[12]\})\S)+((?!\{word[12]\}).)*\{word2\}((?!\{word[12]\}).)*$
...