W3docs

Классы символов в регулярных выражениях 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 и т. д.
javascript— editable

Одно сокращение соответствует одному символу. Добавьте квантификатор, чтобы сопоставить последовательность — \d+ означает «одна или более цифр»:

javascript— editable

Отрицательные классы: \D \W \S

У каждого сокращения есть заглавный вариант, который соответствует противоположному набору — любому символу, которого нет в исходном классе.

КлассСоответствует
\Dлюбой символ, который не является цифрой
\Wлюбой символ, который не является словесным
\Sлюбой символ, который не является пробельным
javascript— editable

Удобный приём: \D (или [^\d]) позволяет удалить всё, кроме цифр, что часто используется при обработке пользовательского ввода, например номеров телефонов.

javascript— editable

Точка . и флаг s (dotAll)

Точка . — специальный класс символов, соответствующий любому одиночному символу, кроме символа переноса строки (\n, \r и нескольких Unicode-разделителей строк).

javascript— editable

Если нужно, чтобы точка соответствовала и символам переноса строки, добавьте флаг s (сокращение от «dotAll»):

javascript— editable

Полный список флагов регулярных выражений, таких как g, i и s, см. в разделе шаблоны и флаги.

Пользовательские классы символов: [...]

Когда встроенные сокращения не подходят, создайте собственный класс, перечислив символы в квадратных скобках. [abc] соответствует одному символу: a, b или c.

javascript— editable

Диапазоны

Дефис - между двумя символами создаёт диапазон: [a-z] соответствует любой строчной букве, [0-9] — любой цифре. В одном классе можно комбинировать несколько диапазонов и отдельные символы. (Подробнее см. в разделе множества и диапазоны.)

javascript— editable

Отрицательные пользовательские классы [^...]

Символ ^ в качестве первого символа внутри скобок инвертирует класс: [^a-z] соответствует любому символу, который не является строчной буквой.

javascript— editable

Комбинирование сокращений и символов

Сокращённые классы работают и внутри пользовательских классов. [\w.] соответствует словесному символу или литеральной точке — это удобно для токенов вроде строк версий или имён файлов.

javascript— editable

Экранирование внутри классов символов

Внутри [...] большинство метасимволов регулярных выражений теряют своё специальное значение, поэтому их, как правило, не нужно экранировать. Например, [.] соответствует литеральной точке — [\.] здесь не требуется.

Несколько символов всё же требуют внимания:

  • Дефис - — обозначает диапазон между двумя символами. Чтобы указать литеральный дефис, поставьте его первым, последним или экранируйте: [-+], [+-] или [+\-].
  • Каретка ^ — инвертирует класс только в первой позиции. В любом другом месте ([a^]) это литеральный символ ^.
  • Закрывающая скобка ] и обратный слэш \ — всегда экранируйте их: [\]], [\\].
javascript— editable
Внимание

Неправильно расположенный дефис может незаметно создать нежелательный диапазон. [a-z] — это диапазон, [z-a] вызовет синтаксическую ошибку, а [%-/] соответствует каждому символу, чей код находится между % и /. В случае сомнений экранируйте дефис или перенесите его в край класса.

Unicode и флаг u

По умолчанию \w, \d и \s распознают только символы ASCII. С флагом u вы получаете юникод-совместимое сопоставление и экранирующие свойства вида \p{Letter}, которые соответствуют символам из любого языка. Подробности см. в разделе флаг unicode u и класс \p.

Заключение

Классы символов позволяют описывать тип нужного символа вместо перечисления всех вариантов:

  • \d \w \s соответствуют цифрам, словесным символам и пробельным символам; \D \W \S — их противоположностям.
  • Точка . соответствует любому символу, кроме переноса строки, — если только не добавлен флаг s (dotAll).
  • Квадратные скобки [...] создают пользовательские наборы; диапазоны задаются через -, инверсия — через ведущий ^, и помните, что большинство метасимволов внутри класса воспринимаются буквально.

Комбинируйте эти классы с квантификаторами, чтобы сопоставлять повторяющиеся символы и создавать мощные, читаемые шаблоны.

Практика

Практика
Какие из следующих вариантов являются допустимыми классами символов в JavaScript?
Какие из следующих вариантов являются допустимыми классами символов в JavaScript?
Was this page helpful?