Что означает `?` В этом регулярном выражении Perl? - PullRequest
5 голосов
/ 08 октября 2010

У меня есть Perl регулярное выражение. Но я не уверен, что "?" значит в этом контексте.

m#(?:\w+)#

Что означает ? здесь?

Ответы [ 5 ]

25 голосов
/ 08 октября 2010

В этом случае ? фактически используется в связи с :. Сочетание ?: в начале группировки означает группирование, но не захватывание текста / шаблона в скобках (например, он не будет сохранен ни в каких обратных ссылках, таких как \1 или $1, поэтому вы не будете иметь возможность прямого доступа к сгруппированному тексту).

В частности, ? имеет три различных значения в регулярном выражении:

  1. Квантор ? означает «ноль или одно повторение» выражения. Один из канонических примеров, которые я видел, это s?he, который будет соответствовать she и he, поскольку ? делает s "необязательным"

  2. Когда за квантификатором (+, *, ? или общим {n,m}) следует ?, тогда совпадение не является жадным (т. Е. Оно будет соответствовать наименьшему строка, начинающаяся с той позиции, которая позволяет продолжить матч)

  3. A ? в начале группы в скобках означает, что вы хотите выполнить специальное действие. Как и в этом случае, : означает группирование, но не захват. Точный список доступных действий будет несколько отличаться от одного механизма регулярных выражений к другому, но вот список (не обязательно всеобъемлющий) некоторых из них:

    A. Группа без захвата : (?:text)
    B. Lookaround : (?=a) для прогнозирования, ?! для негативного прогнозирования или ?<= и ?<! для прогнозирования (положительный и отрицательный соответственно).
    C. Условные совпадения : (?(condition)then|else).
    D. Атомная группировка : a(?>bc|b)c (соответствует abcc, но не abc; см. Ссылку)
    E. Встроенное включение / отключение модификаторов соответствия регулярному выражению : ?i для включения режима, ?-i для отключения. Вы также можете включать / отключать более одного модификатора одновременно, просто объединяя их, например, ?im (i не чувствителен к регистру и m является многострочным).
    F. Именованные группы захвата : (?P<name>pattern), на которые впоследствии можно ссылаться с помощью (?P=name). Механизм регулярных выражений .NET использует синтаксис (?<name>pattern).
    Г. Комментарии : (?#Comment text). Лично я думаю, что это только добавляет беспорядок, но я думаю, что это могло бы послужить некоторому использованию ... Режим свободного пробега может быть лучшим вариантом (модификатор (?x)).

Так что, по сути, цель ? является просто контекстной. Если вы хотите ноль или более повторений буквального символа (, вам нужно будет использовать \(?, чтобы избежать парен.

7 голосов
/ 08 октября 2010

$ perldoc perlreref :

(?:...) Группы подвыражений без захвата (кластер)

Вы также можете использовать YAPE :: Regex :: Explain :

C:\\Temp> perl -MYAPE::Regex::Explain -e \ 
"print YAPE::Regex::Explain->new(qr#(?:\w+)#)->explain"

The regular expression:

(?-imsx:(?:\w+))

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  (?:                      group, but do not capture:
----------------------------------------------------------------------
    \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                             more times (matching the most amount
                             possible))
----------------------------------------------------------------------
  )                        end of grouping
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------
2 голосов
/ 08 октября 2010

Короче говоря, последовательность (? запускает специальную функцию регулярного выражения.Вещи, которые следуют за (?, определяют специальную функцию, в данном случае, не захватывающую группировку.Мы покрываем это как в Промежуточном Perl , так и в Эффективном программировании Perl .Регулярные выражения Perl perlre .

2 голосов
/ 08 октября 2010

Это не захватывающие скобки. Они используются для группировки (как обычные скобки), но группа не будет добавлена ​​в массив захвата (то есть она не будет ссылаться с \ n).

См. Здесь: http://www.regular -expressions.info / refadv.html

1 голос
/ 08 октября 2010

См. Учебник regex , который устанавливается с каждой версией Perl (в частности, этот раздел ).

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