Многострочный режим, флаг «m» в регулярных выражениях

Многострочный режим, флаг «m» в регулярных выражениях

Здравствуйте!  В этом уроке разговор пойдет о многострочном режиме в регулярных выражениях.  Данный режим включается, если у шаблона регулярного выражения  присутствует  флаг /m.

В этом случае изменится поведение ^ и $. О них я писал здесь

Дело в том, что в многострочном режиме якоря обозначают не только начало и конец текста, но также начало и конец строки.

многострочный режим в регулярных выражениях

Начало строки ^

В примере текст состоит из нескольких строк.  Шаблон  /^\d+/gm  выбирает число с начала каждой строки:

var str1 = '1е место: Шапокляк\n' +
  '2е место: Крокодил Гена\n' +
  '44е место: Питон Каа';
alert( str1.match(/^\d+/gm) ); // 1, 2, 44

А вот  – без флага /m  мы бы нашли только первое число:

var str1 = '1е место: Шапокляк\n' +
  '2е место: Крокодил Гена\n' +
  '33е место: Питон Каа';

alert( str1.match(/^\d+/g) ); // 1

Это происходит  потому что в обычном режиме каретка ^ – это только начало текста, а  вот в  многострочном – начало любой строки.
Соответственно  шаблон регулярных выражений  ищет  по тексту, и как только находит начало строки, начинает искать там \d+, то есть цифру.

Конец строки $

Символ доллара $  будет вести себя аналогично.

Шаблон [а-я]+$ в  примере  будет находить последнее слово в каждой строке:

var str1 = '1е место: Шапокляк\n' +
  '2е место: Крокодил Гена\n' +
  '33е место: Питон Каа';

alert( str1.match(/[а-я]+$/gim) ); // Шапокляк,Гена,Каа

Без флага m  символ  $ обозначал  конец  текста, и  соответственно нашел бы последнее слово.

Якорь $ против \n

В принципе для того, чтобы найти конец строки,  вы можете использовать не только  якорь $, но и  также символ \n.

Но, в отличие от  якоря $, символ \n во-первых  будет брать символ в результат, а во-вторых – не будет совпадать  в конце текста (в том случае, если  последний символ – не конец строки).

Читайте также  Методы RegExp и String для работы с регулярными выражениями

Давайте посмотрим, что будет с примером  если вместо [а-я]+$ использовать [а-я]+\n:

var str1 = '1е место: Шапокляк\n' +
  '2е место: Крокодил Гена\n' +
  '33е место: Питон Каа';

alert( str1.match(/[а-я]+\n/gim) );
/*
Шапокляк
,Гена
*/

Всего 2 результата: Шапокляк\n (с символом перевода строки) и Гена\n. Последнее слово «Каа» здесь не даёт совпадения, поскольку после него нет перевода строки.

Итоги

В многострочном режиме:

  • Символ ^ будет означать начало строки.
  • Символ $ будет означать конец строки.

Оба символа являются проверками, они не добавляют ничего к результату. Про них также говорят, что «они имеют нулевую длину».

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Плюсануть
Поделиться

Об авторе

admin administrator

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: