Подтвердить что ты не робот

Имеет ли квантификатор {0} смысл в некоторых сценариях?

Пример:

/(?: Foo) {0} бар /

В другом ответе я увидел нечто подобное. Сначала я подумал: "Что это должно быть", но затем "ОК может иметь смысл, вид негативного взгляда", так что Foo недопустим до bar, но это не работает.

Вы можете увидеть это здесь, в Regexr: он соответствует только bar, но он также соответствует bar в Foobar.
Когда я добавляю якорь для начала строки:

/^(?:Foo){0}bar/

он ведет себя так, как я ожидаю. Он соответствует только bar, а не bar в Foobar.

Но это точно такое же поведение, как если бы я использовал только /bar/ или /^bar/.

Является ли квантор {0} только бесполезным побочным эффектом, или действительно ли это полезно для этого?

4b9b3361

Ответ 1

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

  • Лучший вариант - использование группы в рекурсивных регулярных выражениях (или других странных конструкциях). Например, Perl имеет (?(DEFINE) ) для такого же использования.
    Быстрый пример - в PHP это будет соответствовать barFoo (рабочий пример):

    preg_match("/(?:(Foo)){0}bar(?1)/", "barFoo", $matches);
    
  • Добавление неудавшейся захваченной группы (именованной или нумерованной) к совпадению результата.

  • Сохранение индексов всех групп без изменений в случае рефакторинга шаблона.

Меньше пользы, как предложил Питер, полезны в:

  • Сгенерированные шаблоны.
  • Считываемость. Шаблоны с определенным дублированием, где {0} и {1} могут привести мышление в правильном направлении. (ОК, не самая лучшая точка)

Это все редкие случаи, и в большинстве моделей это ошибка.

Ответ 2

Явное количество повторений нуля может быть полезно в автоматически генерируемых регулярных выражениях. Вы избегаете кодирования специального случая для нулевых повторений таким образом.

Ответ 3

В традиционных регулярных выражениях /x{0}/ (language = {x n: x = 0}) означало бы "совпадение точно 0 из x", что совпадает с // ( язык = {Λ}). Поскольку эти два эквивалента, вы должны иметь возможность удалить любой /x{0}/, который вы находите.

Но PCRE и другие расширения для регулярных выражений могут быть довольно византичными. Я не удивлюсь, если /x{0}/ что-то сделал в Perl. Я был бы противен, но не удивился.

Я думаю, что это, вероятно, какой-то артефакт программы, которая автоматически генерирует регулярные выражения, но не упрощает их. Какой позор, так как так легко писать программы, которые упрощают регулярные выражения.

Ответ 4

Я не могу придумать ни одной веской причины использовать x{0}. Но я могу придумать несколько причин, почему этого следует избегать:

  • Это бесполезно, поскольку оно всегда соответствует.
  • Он замедляет двигатель регулярного выражения (если регулярное выражение предварительно скомпилировано).
  • Это, вероятно, признак непонимания автором регулярных выражений.

Я готов поспорить, что кто-то, кто пишет (?:foo){0}, пытается сказать "убедитесь, что foo здесь не соответствует", что, конечно, терпит неудачу, потому что пустую строку всегда можно сопоставить, будь то foo есть или нет. Для чего нужны отрицательные утверждения. (?<!foo)bar и т.д.