Что означает регулярное выражение "?: ^"?

Я рассматриваю это подвыражение (это в JavaScript):

(?:^|.....)

Я знаю, что ? означает "ноль или один раз", когда он следует за символом, но не уверен, что это означает в этом контексте.

Ответы

Ответ 1

Вероятно, вы видите это в этом контексте

(?:...)

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

РЕДАКТИРОВАТЬ: Чтобы отразить измененный вопрос:

(?:^|....)

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

Ответ 2

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

(foo)     // default behavior, matches "foo" and stores a back-reference
(?:foo)   // non-capturing group: matches "foo", but doesn't store a back-ref
(?i:foo)  // matches "foo" case-insensitively
(?=foo)   // matches "foo", but does not advance the current position
          // ("positive zero-width look-ahead assertion")
(?!foo)   // matches anything but "foo", and does not advance the position 
          // ("negative zero-width look-ahead assertion")

чтобы назвать несколько.

Все они начинаются с "?", что является способом указания модификатора группы. В этом случае знак вопроса не имеет ничего общего с опциональностью.

Он просто говорит:

(?:^foo)  // match "foo" at the start of the line, but do not store a back-ref

Иногда он просто перегружает, чтобы сохранить обратную ссылку на какую-то часть матча, которую вы не собираетесь использовать в любом случае. Когда группа существует только для того, чтобы сделать сложное выражение атомом (например, оно должно либо совпадать, либо сбой в целом), сохранение обратной ссылки является ненужной тратой ресурсов, которая может даже немного замедлить регулярное выражение. И иногда, вы просто хотите, чтобы группа 1 была первой группой, относящейся к вам, вместо первой группы в регулярном выражении.

Ответ 3

(?:some stuff) означает, что вы не хотите сопоставлять выражение в круглых скобках отдельно. Обычно части регулярного выражения, сгруппированные в круглые скобки, группируются и могут быть указаны индивидуально (это называется использованием обратных ссылок).

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

Ответ 4

Краткий ответ

Он помещает (скобку) группу в группу non-captureing.

Подробнее об этом частном выражении

Обозначение для группы, не связанной с захватом, составляет:

(?:<expresson>)

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

Похоже, что они используют оператор "или" (труба) с кареткой. Таким образом, они ищут совпадение с кареткой или чем-то, что находится справа от трубы, но не захватывают выражение как группу (выполняемое с помощью ?: в начале группировки символов.

В целом

Группы, не связанные с захватом, позволяют группировать выражение таким образом, который не будет back-refernceable, а также увеличит производительность выражения.

Ответ 6

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

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

Изменить: это должно быть так, что не захватывает, кажется, работает нормально.