4

Вопрос такой: Что означает первый знак ? слева в скобках

\.(?i:gif|jpe?g|png)$
John Kent
  • 287
  • 1
    https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F#%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D1%8B – Mike Apr 01 '18 at 15:52
  • @mike А что означает двоеточие после ?i (на вики не нашел) – John Kent Apr 01 '18 at 16:03
  • 1
    Прочитайте внимательно текст прямо под таблицей на вики (цитата: Если использование модификаторов требуется только в пределах группы, то нужный шаблон указывается внутри группы после модификаторов но перед двоеточием) – Mike Apr 01 '18 at 16:06
  • 2
    Хотя это предложение конечно как то странно читается... Но пример в следующем предложении все объясняет – Mike Apr 01 '18 at 16:12

2 Answers2

4

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

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

Для начала:
Некое выражение, заключенное в скобки называется в регулярных выражениях группой

(это группа)

Итак, мы создаем язык регулярных выражений с нуля и мы не хотим перегружать язык множеством мета-символов и при этом нам ещё надо описать языком кучу возможностей:

  • атомарную группировку
  • именованные группы
  • группы без сохранения
  • рекурсии
  • изменение флагов внутри регулярного выражения
  • и много-много других

А что бы мы сделали, если бы писали новый императивный язык? Мы бы написали кучу стандартных функций:

  • function atomic( expression ) { [native code] }
  • function isNamedGroup( expression ) { [native code] }
  • function groupWithoutCapture( expression ) { [native code] }
  • и так далее

Грубо говоря

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

А с таким пониманием всё становится очень просто:

  • (?> ... ) - атомарная группировка
  • (?P<name> ... ) - именованная группа
  • (?: ... ) - группа без сохранения захваченного
  • (?R) - рекурсия
  • (?i ... ) - изменение флага внутри группы
  • и много-много других, полный список в учебниках и гайдах

Всё это объединяет одно- конструкция начинается с (?, применяется до закрывающей ) и каким-либо образом добавляет функционал для обработки текста.

ReinRaus
  • 17,873
  • 3
  • 47
  • 86
1
(?i:

значит "case insensitive" - что поиск (до соответствующей закрывающей скобки) не будет делать разницу между прописными и строчными буквами.

И так ваше выражение

\.(?i:gif|jpe?g|png)$

будет например успешно так для .gif как и для .GIF, .gIf, .jpg .JPG .pNg итд.

MarianD
  • 17,120