В этом уроке мы разберем, что такое модификаторы в регулярных выражениях, как и для чего они могут использоваться. Модификаторы в JavaScript применяются по-другому, не так как показано в примерах, поэтому для экспериментов с ними используйте PCRE.
В примере ниже регулярное выражение соответствует одной подстроке:
/(?:t.)-(?:t.)
/
ta-tu
ta-t
Tu-tu tu-T
Здесь сопоставляются две группы символов через дефис ta-tu
, каждая из которых соответствует условию "t
и любой символ". Группировка без обратной связи находит только выражение целиком, а не две отдельных группы. Остальные символы из строки не проходят сопоставление. Среди них T
в верхнем регистре и перевод строки. Первый не находится, поскольку в выражении символ t
указан в нижнем регистре, а второй — поскольку точка по умолчанию не включает перевод строки.
Мы можем минимально изменить выражение таким образом, чтобы оно включало другие подстроки из примера. Для этого воспользуемся модификатором.
Модификаторы — это символы, которые указываются после знака ?
в группе символов регулярного выражения и меняют их поведение. Если после ?
мы поставим i
, то включим режим игнорирования регистра и получим сопоставление ещё одной подстроки, но уже не с t
в нижнем регистре, а с T
в верхнем:
/(?i:t.)-(?:t.)
/
ta-tu
ta-t
Tu-tu
tu-T
Если мы сделаем так, что вторая часть подстроки после дефиса Tu-tu
будет также с большой буквы, то сопоставления по ней не будет, потому что модификатор действует только в рамках группы, где он определен.
/(?i:t.)-(?:t.)
/
ta-tu
ta-t
Tu-Tu tu-T
Поэтому давайте продублируем модификатор i
во второй группе и получим сопоставление строки Tu-Tu
:
/(?i:t.)-(?i:t.)
/
ta-tu
ta-t
Tu-Tu
tu-T
Такая запись получается более коротким вариантом его аналога: (?:[tT].)-(?:[tT].)
.
Модификаторы можно выносить и в отдельные группы:
/(?i)(t.)-(?i)(t.)
ta-tu
ta-t
Tu-Tu
tu-T
Но в этом случае будет выделена память под 4 группы совпадений.
Рассмотрим еще один интересный модификатор s
. Он делает так, что точка начинает включать в себя перевод строки и возврат каретки. Нам уже известно, что точка по умолчанию их не включает, и мы могли убедиться в этом в самом начале урока. После ta-t
и tu-T
следует перевод строки, поэтому эти подстроки не сопоставляются. Укажем модификатор s
во второй группе, и теперь у нас совпадут все подстроки:
/(?i:t.)-(?si:t.)
/
ta-tu ta-t
Tu-Tu tu-T
Модификаторы могут быть отключены. Для этого достаточно указать перед ними -
. Давайте добавим -
в первую группу и посмотрим на наш пример:
/(?-i:t.)-(?si:t.)
/
ta-tu ta-t
Tu-Tu tu-T
Активные и отключенные модификаторы можно комбинировать. Мы можем добавить модификатор s
и отменить i
и m
:
/(?s-im:t.)-(?si:t.)
/
ta-tu ta-t
Tu-Tu tu-T
Вам ответят команда поддержки Хекслета или другие студенты.
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт