Если строка – не комментарий, код проверяет, начинает ли она новую секцию. Если да, он создаёт новый объект для текущей секции, к которому добавляются последующие настройки.
Последняя осмысленная возможность – строка является обычной настройкой, и в этом случае она добавляется к текущему объекту.
Если ни один вариант не сработал, функция выдаёт ошибку.
Заметьте, как частое использование ^и $заботится о том, что выражение совпадает со всей строкой целиком, а не с частью. Если их не использовать, код в целом будет работать, но иногда будет выдавать странные результаты, и такую ошибку будет трудно отследить.
Конструкция 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, где можно посмотреть её визуализацию и сравнить с желаемым эффектом.
Читать дальше