Если строка – не комментарий, код проверяет, начинает ли она новую секцию. Если да, он создаёт новый объект для текущей секции, к которому добавляются последующие настройки.
Последняя осмысленная возможность – строка является обычной настройкой, и в этом случае она добавляется к текущему объекту.
Если ни один вариант не сработал, функция выдаёт ошибку.
Заметьте, как частое использование ^
и $
заботится о том, что выражение совпадает со всей строкой целиком, а не с частью. Если их не использовать, код в целом будет работать, но иногда будет выдавать странные результаты, и такую ошибку будет трудно отследить.
Конструкция if (match = string.match(...))
похожа на трюк, использующий присвоение как условие в цикле while
. Часто вы не уверены, что вызов match
будет успешным, поэтому вы можете получить доступ к результирующему объекту только внутри блока if
, который это проверяет. Чтобы не разбивать красивую цепочку проверок if
, мы присваиваем результат поиска переменной, и сразу используем это присвоение как проверку.
Из-за изначально простой реализации языка, и последующей фиксации такой реализации «в граните», регулярки JavaScript тупят с символами, не встречающимися в английском языке. К примеру, символ «буквы» с точки зрения регулярок JavaScript, может быть одним из 26 букв английского алфавита, и почему-то ещё подчёркиванием. Буквы типа é или β, однозначно являющиеся буквами, не совпадают с \w
(и совпадут с \W
, то есть с не-буквой).
По странному стечению обстоятельств, исторически \s
(пробел) совпадает со всеми символами, которые в Unicode считаются пробельными, включая такие штуки, как неразрывный пробел или монгольский разделитель гласных.
У некоторых реализаций регулярок в других языках есть особый синтаксис для поиска специальных категорий символов Unicode, типа «все прописные буквы», «все знаки препинания» или «управляющие символы». Есть планы по добавлению таких категорий и в JavaScript, но они, видимо, будут реализованы нескоро.
Регулярки – это объекты, представляющие шаблоны поиска в строках. Они используют свой синтаксис для выражения этих шаблонов.
/abc/
Последовательность символов
/[abc]/
Любой символ из списка
/[^abc]/
Любой символ, кроме символов из списка
/[0-9]/
Любой символ из промежутка
/x+/
Одно или более вхождений шаблона x
/x+?/
Одно или более вхождений, нежадное
/x*/
Ноль или более вхождений
/x?/
Ноль или одно вхождение
/x{2,4}/
От двух до четырёх вхождений
/(abc)/
Группа
/a|b|c/
Любой из нескольких шаблонов
/\d/
Любая цифра
/\w/
Любой алфавитно-цифровой символ («буква»)
/\s/
Любой пробельный символ
/./
Любой символ, кроме переводов строки
/\b/
Граница слова
/^/
Начало строки
/$/
Конец строки
У регулярки есть метод test
, для проверки того, есть ли шаблон в строке. Есть метод exec
, возвращающий массив, содержащий все найденные группы. У массива есть свойство index
, показывающее, где начался поиск.
У строк есть метод match
для поиска шаблонов, и метод search
, возвращающий только начальную позицию вхождения. Метод replace
может заменять вхождения шаблона на другую строку. Кроме этого, вы можете передать в replace
функцию, которая будет строить строчку на замену, основываясь на шаблоне и найденных группах.
У регулярок есть настройки, которые пишут после закрывающего слэша. Опция i
делает регулярку регистронезависимой, а опция g
делает её глобальной, что, кроме прочего, заставляет метод replace
заменять все найденные вхождения, а не только первое.
Конструктор RegExp
можно использовать для создания регулярок из строк.
Регулярки – острый инструмент с неудобной ручкой. Они сильно упрощают одни задачи, и могут стать неуправляемыми при решении других, сложных задач. Часть умения пользоваться регулярками состоит в том, чтобы уметь сопротивляться искушению запихнуть в них задачу, для которой они не предназначены.
Неизбежно при решении задач у вас возникнут непонятные случаи, и вы можете иногда отчаиваться, видя непредсказуемое поведение некоторых регулярок. Иногда помогает изучить поведение регулярки через онлайн-сервис типа debuggex.com, где можно посмотреть её визуализацию и сравнить с желаемым эффектом.
Читать дальше