Групповая группа non-capture нерегламента PHP regex

Я использую регулярное выражение для соответствия дате, и все идет хорошо, у меня это до сих пор:

"/(?:[0-3])?[0-9]-(?:[0-1])?[0-9]-(?:20)[0-1][0-9]/" 

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

Но у меня есть два простых вопроса относительно этих результатов:

  1. (?: ) что это простое объяснение? По-видимому, это несогласованная группа. Но потом…

  2. Что такое трейлинг ? для? например (? )?

[Отредактировано (еще раз), чтобы улучшить форматирование и исправить ввод.]

Это комментарий и ответ.

Часть ответа … Я согласен с предыдущим ответом alex.

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

  2. ? после (?: ) – или при выполнении чего-либо кроме * + ? или {} – означает, что предыдущий элемент может быть найден или не найден в законном совпадении. Например, /z34?/ Будет соответствовать z3, а также z34, но он не будет соответствовать z35 или z и т. Д.

Часть комментария … Я сделал то, что можно было бы считать усовершенствованием регулярного выражения, над которым вы работали:

 (?:^|\s)(0?[1-9]|[1-2][0-9]|30|31)-(0?[1-9]|10|11|12)-((?:20)?[0-9][0-9])(?:\s|$) 

– Во-первых, он избегает таких вещей, как 0-0-2011

– Во-вторых, он избегает таких вещей, как 233443-4-201154564

В-третьих, он включает в себя такие вещи, как 1-1-2022

– В-четвертых, он включает в себя такие вещи, как 1-1-11

– В-пятых, он избегает таких вещей, как 34-4-11

– В-шестых, это позволяет вам записывать день, месяц и год, чтобы вы могли более легко ссылаться на них в коде .. код, который, например, выполнил бы дальнейшую проверку (является второй захваченной группой 2 и является либо первая захваченная группа 29, и это високосный год, или же первая захваченная группа <29), чтобы узнать, соответствует ли дата 29 года или нет.

Наконец, обратите внимание, что вы все равно получите даты, которые не будут существовать, например, 31-6-11. Если вы хотите избежать этого, попробуйте:

 (?:^|\s)(?:(?:(0?[1-9]|[1-2][0-9]|30|31)-(0?[13578]|10|12))|(?:(0?[1-9]|[1-2][0-9]|30)-(0?[469]|11))|(?:(0?[1-9]|[1-2][0-9])-(0?2)))-((?:20)?[0-9][0-9])(?:\s|$) 

Кроме того, я предположил, что датам будет предшествовать и следует пробел (или beg / end of line), но вы можете отрегулировать это (например, чтобы позволить пунктуации).

Один комментатор в другом месте ссылается на этот ресурс, который может вам пригодиться: http://rubular.com/

  1. Это не захватывающая группа. Вы не можете вернуться к нему. Обычно используется для обратных ссылок declutter и / или повышения производительности.
  2. Это означает, что предыдущая группа захвата является необязательной.

Подмаски

Подшаблоны ограничены круглыми скобками (круглые скобки), которые могут быть вложенными. Маркировка части шаблона в качестве подшаблона делает две вещи:

  1. Он локализует набор альтернатив. Например, шаблон cat (aract | erpillar |) соответствует одному из слов «cat», «катаракта» или «гусеница». Без круглых скобок это соответствовало бы «катаракта», «эрпиляр» или пустая строка.
  2. Он устанавливает подшаблон как подшаблон захвата (как определено выше). Когда весь шаблон совпадает, эта часть строки субъекта, которая соответствует подшаблону, передается обратно вызывающему абоненту через аргумент ovector pcre_exec (). Открывающиеся круглые скобки подсчитываются слева направо (начиная с 1), чтобы получить номера захваченных подшаблонов.

Например, если строка «красный король» сопоставляется с рисунком ((красный | белый) (король | королева)), то захваченные подстроки являются «красным королем», «красным» и «королем» и пронумерованы 1, 2 и 3.

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

В качестве удобной стенограммы, если в начале неуправляемого подшаблона требуются какие-либо параметры, буквы «Option» могут появляться между «?» и ":". Таким образом, два шаблона

 (?i:saturday|sunday) (?:(?i)saturday|sunday) 

соответствуют точно такой же набор строк. Поскольку альтернативные ветви проверяются слева направо, а опции не сбрасываются до тех пор, пока не будет достигнут конец подшаблона, параметр в одной ветви влияет на последующие ветви, поэтому приведенные выше шаблоны соответствуют «ВОСКРЕСЕНЬЕ», а также «Суббота».

С помощью синтаксиса (? Ppattern) можно назвать подшаблон. Затем этот подшаблон будет индексироваться в массиве совпадений по его обычной числовой позиции, а также по имени. В PHP 5.2.2 были представлены два альтернативных синтаксиса (? Pattern) и (? 'Name'pattern).

Иногда необходимо иметь несколько совпадающих, но чередующихся подгрупп в регулярном выражении. Обычно каждому из них будет присвоен свой номер обратной ссылки, хотя только один из них, возможно, будет соответствовать. Чтобы преодолеть это, синтаксис (? |) Позволяет иметь повторяющиеся числа. Рассмотрим следующее регулярное выражение, сопоставляемое с строкой Sunday:

 (?:(Sat)ur|(Sun))day 

Здесь Sun хранится в backreference 2, а backreference 1 пуст. Соответствующие выходы Сб в backreference 1, а backreference 2 не существует. Изменение шаблона для использования (? | Исправляет эту проблему:

 (?|(Sat)ur|(Sun))day 

Используя этот шаблон, как Sun, так и Sat будут сохранены в backreference 1.

Ссылка: http://php.net/manual/en/regexp.reference.subpatterns.php