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

Некоторое время назад я видел в regex (по крайней мере, на 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 это было сложно.

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

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

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

Ответы

Ответ 1

Он доступен на странице Subpatterns официальной документации.

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

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

(?i:foo)bar

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

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

Но не

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Источник

Ответ 5

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

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

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

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

Ответ 6

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

$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);