Документация для?: В регулярном выражении?

Некоторое время назад я видел в регулярном выражении (по крайней мере, на PHP), вы можете сделать группу захвата, которая не будет захвачена путем добавления ?: .

пример

 $str = 'big blue ball'; $regex = '/b(ig|all)/'; preg_match_all($regex, $str, $matches); var_dump($matches); 

Выходы …

 array(2) { [0]=> array(2) { [0]=> string(3) "big" [1]=> string(4) "ball" } [1]=> array(2) { [0]=> string(2) "ig" [1]=> string(3) "all" } } 

В этом примере мне все равно, что было сопоставлено в скобках, поэтому я добавил ?: ( '/b(?:ig|all)/' ) и получил выход

 array(1) { [0]=> array(2) { [0]=> string(3) "big" [1]=> string(4) "ball" } } 

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

Я пытался найти документацию и официальное название для этого (я называю это не захватывающей группой, но, думаю, я слышал это раньше).

Будучи символами, Google для Google это было сложно.

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

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

Итак, каково собственное имя для них, и где я могу узнать больше?

Он доступен на странице « Подшивки» официальной документации.

Тот факт, что простые круглые скобки выполняет две функции, не всегда полезен. Часто бывает, когда требуется подпанель группировки без требования захвата. Если за открывающей скобкой следует «?:», Подшаблон не выполняет никакого захвата и не учитывается при подсчете числа последующих последующих подматриц. Например, если строка «белая королева» сопоставляется с рисунком ((?: Red | white) (king | queen)), то захваченные подстроки являются «белой королевой» и «королевой» и пронумерованы 1 и 2 Максимальное количество захваченных подстрок равно 99, а максимальное количество всех подшаблонов, как захваченных, так и не захваченных, равно 200.

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

 (?i:foo)bar 

Будет соответствовать:

  • Foobar
  • Foobar
  • Foobar
  • …и т.д

Но нет

  • Foobar
  • Foobar
  • …и т.д

О, и хотя официальная документация на самом деле явно не указывает синтаксис, она ссылается на нее позже как на «не захватывающий подшаблон» (что имеет смысл, и это то, что я бы назвал так или иначе, поскольку это не совсем «группа», но подшаблон) …

(?:) в целом представляет собой группу, не связанную с захватом .

Regular-expressions.info упоминает этот синтаксис:

Вопросительный знак и двоеточие после открытой круглой скобки являются специальным синтаксисом, который можно использовать, чтобы сообщить движку регулярных выражений, что эта пара скобок не должна создавать обратную ссылку. Обратите внимание, что вопросительный знак […] – это оператор регулярных выражений, который делает предыдущий токен необязательным. Этот оператор не может появиться после открытия круглого кронштейна, потому что открывающая скобка сама по себе не является допустимым токеном регулярного выражения. Поэтому не существует путаницы между вопросительным знаком как оператором, чтобы сделать маркер необязательным, а знак вопроса – символом для изменения свойств пары круглых скобок. Двоеточие указывает, что изменение, которое мы хотим сделать, это отключить захват обратной ссылки.

Вот что я нашел:

Если вы не используете backreference, вы можете оптимизировать это регулярное выражение в Set (?: Value) ?. Вопросительный знак и двоеточие после открытой круглой скобки являются специальным синтаксисом, который можно использовать, чтобы сообщить движку регулярных выражений, что эта пара скобок не должна создавать обратную ссылку. Обратите внимание на знак вопроса после того, как открывающая скобка не связана с вопросительным знаком в конце регулярного выражения. Этот знак вопроса – это оператор регулярных выражений, который делает предыдущий токен необязательным. Этот оператор не может появиться после открытия круглого кронштейна, потому что открывающая скобка сама по себе не является допустимым токеном регулярного выражения. Поэтому не существует путаницы между вопросительным знаком как оператором, чтобы сделать маркер необязательным, а знак вопроса – символом для изменения свойств пары круглых скобок. Двоеточие указывает, что изменение, которое мы хотим сделать, это отключить захват обратной ссылки.

http://www.regular-expressions.info/brackets.html

Это в руководстве php, и я считаю, что любой другой почти полный раздел регулярных выражений для любого языка …

Тот факт, что простые круглые скобки выполняет две функции, не всегда полезен. Часто бывает, когда требуется подпанель группировки без требования захвата. Если за открывающей скобкой следует «?:», Подшаблон не выполняет никакого захвата и не учитывается при подсчете числа последующих последующих подматриц.

Источник

PHP preg_match_all использует синтаксис PCRE (Perl-Compatible Regular Expression), который описан здесь . Неподдерживающие подшаблоны документируются в главе «Подшаблоны» .

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

Нет, есть много разных функций, которые запускаются с помощью open-bracket-question-mark. Lookahead / lookbehind – это только первый, с которым вы познакомились.

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

Я не знаю, как это сделать?:, Но с простым циклом это легко:

 $regex = '/b(ig|all)/'; $array = array( 0 => array(0 => 'big', 1 => 'ball'), 1 => array(0 => 'ig', 1 => 'all') ); foreach ($array as $key => $row) { foreach ($row as $val) { if (!preg_match($regex, $val)) { unset($array[$key]); } } } print_r($array); с $regex = '/b(ig|all)/'; $array = array( 0 => array(0 => 'big', 1 => 'ball'), 1 => array(0 => 'ig', 1 => 'all') ); foreach ($array as $key => $row) { foreach ($row as $val) { if (!preg_match($regex, $val)) { unset($array[$key]); } } } print_r($array);