Флаг m в регулярных выражениях JavaScript (многострочный режим)
Флаг m в регулярных выражениях JavaScript позволяет якорям ^ и $ совпадать с началом и концом каждой строки в многострочной строке.
Введение в многострочный режим
Флаг m в JavaScript регулярных выражениях позволяет якорям ^ и $ якоря совпадать с началом и концом каждой строки в многострочной строке, а не только с началом и концом всей строки целиком. Это особенно полезно при работе с многострочным текстом, когда нужно выполнять сопоставление шаблонов построчно.
На этой странице рассматривается, что именно изменяет флаг m, чем он отличается от поведения якорей по умолчанию, как он сочетается с флагами g и i, а также практические шаблоны для разбора текста в построчном формате, например журналов.
Поведение по умолчанию и многострочный режим
По умолчанию (без m) ^ совпадает только с самым началом всей строки, а $ — только с самым концом. Перенос строки (\n) внутри строки является обычным символом — он не создаёт новых позиций для якорей.
С флагом m якорь ^ также совпадает с позицией сразу после каждого \n, а $ — с позицией сразу перед каждым \n (а также с истинным началом и концом строки). Само совпадение никогда не включает символ переноса строки — якоря являются позициями нулевой ширины.
Без m якорем ^ фиксируется только abc в самом начале строки. Добавление m позволяет ^ также совпадать после переноса строки, поэтому находятся обе строки с abc. (Флаг g собирает все совпадения, а не останавливается на первом.)
Флаг m: включение многострочного режима
При использовании флага m якоря ^ и $ совпадают с позициями до и после переносов строк внутри строки.
Использование флага m
В этом примере регулярное выражение ^abc совпадает с началом каждой строки, начинающейся с «abc», благодаря флагу m. Флаг g гарантирует нахождение всех вхождений. Без флага m совпадение было бы только с «abc» в самом начале строки.
Пример: совпадение с несколькими строками
Здесь регулярное выражение ^start совпадает с началом строк, начинающихся с «start», благодаря комбинации флагов m и g.
Практическое применение
Совпадение со строками в многострочном тексте
Флаг m особенно полезен для поиска конкретных шаблонов в начале или конце каждой строки многострочной строки.
Этот пример показывает, как ^hello с флагом m совпадает с «hello» в начале каждой строки.
Совпадение с концом строк в многострочном тексте
Аналогично, флаг m можно использовать для поиска шаблонов в конце каждой строки.
Здесь world$ с флагом m совпадает с «world» в конце каждой строки.
Пример: извлечение конкретных строк
Этот пример демонстрирует извлечение всех строк, начинающихся с «Error:», из файла журнала с помощью флага m.
Комбинирование флагов
Флаг m можно комбинировать с другими флагами для расширения возможностей регулярных выражений. Например, сочетание флага m с флагом i (регистронезависимый поиск) позволяет выполнять регистронезависимое многострочное сопоставление.
Пример: регистронезависимое многострочное сопоставление
В этом примере регулярное выражение находит строки, содержащие «hello», независимо от регистра, благодаря комбинации флагов m и i.
- Шаблон
^.*hello.*$совпадает с любой строкой, содержащей «hello» в любом регистре. - Флаг
mобеспечивает обработку каждой строки многострочного текста по отдельности. Hello world,hello worldиHELLO WORLD— все совпадают с шаблоном, так как содержат «hello» (регистронезависимо) где-либо в строке.
Используйте флаг m в регулярных выражениях JavaScript, чтобы применять якоря ^ и $ к каждой строке многострочного текста, расширяя возможности проверки и обработки построчного содержимого.
Использование флага m для построчной валидации
Флаг m идеален для сценариев, когда нужно проверять или обрабатывать каждую строку по отдельности внутри многострочной строки.
Пример: проверка формата телефонного номера США
Это регулярное выражение проверяет, что номер телефона соответствует формату (123) 456-7890. Оно использует ^ для фиксации начала и $ для фиксации конца, гарантируя, что вся строка совпадает с указанным шаблоном для каждой строки текста.
Таким образом, и "(123) 456-7890", и "(234) 567-8901" совпадают с шаблоном регулярного выражения, поскольку соответствуют формату (xxx) xxx-xxxx, для которого и предназначен этот шаблон.
Распространённые ошибки
mвлияет только на^и$, но не на.— Точка по-прежнему не совпадает с переносом строки. Если нужно, чтобы.также пересекал переносы строк, используйте отдельный флагs(dotAll). Флагmизменяет, где строки начинаются и заканчиваются; флагsизменяет то, с чем совпадает..m— это не то же самое, что совпадение с целыми словами. Для совпадения на границах слова, а не строки, используйте\b— границу слова вместо^/$.- Без
gметодmatch()возвращает только первое совпадение. Флагmдобавляет новые позиции для якорей, но для сбора всех строк всё равно нужен флагg. Комбинируйте их какgm.
Заключение
Флаг m в регулярных выражениях JavaScript расширяет функциональность якорей ^ и $, позволяя им совпадать с началом и концом каждой строки в многострочной строке. Эта возможность незаменима при обработке многострочных текстовых данных, обеспечивая точное построчное сопоставление и валидацию шаблонов.