Классы символов в регулярных выражениях JavaScript
Классы символов в JavaScript: сокращения \d \w \s, их отрицания \D \W \S, точка, флаг s (dotAll) и пользовательские классы [...] с диапазонами и экранированием.
Классы символов в JavaScript
Класс символов — это часть регулярного выражения, которая соответствует одному символу из определённого набора — например, «любая цифра» или «любой пробельный символ». Вместо того чтобы перечислять все возможные символы, вы описываете тип нужного символа, а движок регулярных выражений выполняет сопоставление.
На этой странице рассматриваются встроенные сокращённые классы (\d, \w, \s), их отрицания (\D, \W, \S), специальная точка . и флаг s (dotAll), а также создание собственных классов с помощью квадратных скобок [...], включая диапазоны и экранирование.
Каждый класс соответствует ровно одному символу. Чтобы сопоставить несколько символов, класс комбинируют с квантификатором, например + или {2,4}.
Сокращённые классы: \d \w \s
JavaScript предоставляет три сокращённых класса для наиболее распространённых групп символов.
| Класс | Соответствует | Эквивалент |
|---|---|---|
\d | цифра | [0-9] |
\w | словесный символ: буква, цифра или знак подчёркивания | [A-Za-z0-9_] |
\s | пробельный символ: пробел, табуляция \t, перенос строки \n и т. д. | — |
Одно сокращение соответствует одному символу. Добавьте квантификатор, чтобы сопоставить последовательность — \d+ означает «одна или более цифр»:
Отрицательные классы: \D \W \S
У каждого сокращения есть заглавный вариант, который соответствует противоположному набору — любому символу, которого нет в исходном классе.
| Класс | Соответствует |
|---|---|
\D | любой символ, который не является цифрой |
\W | любой символ, который не является словесным |
\S | любой символ, который не является пробельным |
Удобный приём: \D (или [^\d]) позволяет удалить всё, кроме цифр, что часто используется при обработке пользовательского ввода, например номеров телефонов.
Точка . и флаг s (dotAll)
Точка . — специальный класс символов, соответствующий любому одиночному символу, кроме символа переноса строки (\n, \r и нескольких Unicode-разделителей строк).
Если нужно, чтобы точка соответствовала и символам переноса строки, добавьте флаг s (сокращение от «dotAll»):
Полный список флагов регулярных выражений, таких как g, i и s, см. в разделе шаблоны и флаги.
Пользовательские классы символов: [...]
Когда встроенные сокращения не подходят, создайте собственный класс, перечислив символы в квадратных скобках. [abc] соответствует одному символу: a, b или c.
Диапазоны
Дефис - между двумя символами создаёт диапазон: [a-z] соответствует любой строчной букве, [0-9] — любой цифре. В одном классе можно комбинировать несколько диапазонов и отдельные символы. (Подробнее см. в разделе множества и диапазоны.)
Отрицательные пользовательские классы [^...]
Символ ^ в качестве первого символа внутри скобок инвертирует класс: [^a-z] соответствует любому символу, который не является строчной буквой.
Комбинирование сокращений и символов
Сокращённые классы работают и внутри пользовательских классов. [\w.] соответствует словесному символу или литеральной точке — это удобно для токенов вроде строк версий или имён файлов.
Экранирование внутри классов символов
Внутри [...] большинство метасимволов регулярных выражений теряют своё специальное значение, поэтому их, как правило, не нужно экранировать. Например, [.] соответствует литеральной точке — [\.] здесь не требуется.
Несколько символов всё же требуют внимания:
- Дефис
-— обозначает диапазон между двумя символами. Чтобы указать литеральный дефис, поставьте его первым, последним или экранируйте:[-+],[+-]или[+\-]. - Каретка
^— инвертирует класс только в первой позиции. В любом другом месте ([a^]) это литеральный символ^. - Закрывающая скобка
]и обратный слэш\— всегда экранируйте их:[\]],[\\].
Неправильно расположенный дефис может незаметно создать нежелательный диапазон. [a-z] — это диапазон, [z-a] вызовет синтаксическую ошибку, а [%-/] соответствует каждому символу, чей код находится между % и /. В случае сомнений экранируйте дефис или перенесите его в край класса.
Unicode и флаг u
По умолчанию \w, \d и \s распознают только символы ASCII. С флагом u вы получаете юникод-совместимое сопоставление и экранирующие свойства вида \p{Letter}, которые соответствуют символам из любого языка. Подробности см. в разделе флаг unicode u и класс \p.
Заключение
Классы символов позволяют описывать тип нужного символа вместо перечисления всех вариантов:
\d \w \sсоответствуют цифрам, словесным символам и пробельным символам;\D \W \S— их противоположностям.- Точка
.соответствует любому символу, кроме переноса строки, — если только не добавлен флагs(dotAll). - Квадратные скобки
[...]создают пользовательские наборы; диапазоны задаются через-, инверсия — через ведущий^, и помните, что большинство метасимволов внутри класса воспринимаются буквально.
Комбинируйте эти классы с квантификаторами, чтобы сопоставлять повторяющиеся символы и создавать мощные, читаемые шаблоны.