Концептуально близкой к рассмотренной конструкции объединения является еще одна регулярная операция, которая обеспечивает выбор любого символа из заданного класса символов. Данная операция применяется, когда необходимо задать набор символов, которые могут находиться в определенной позиции входной строки. Для обозначения класса символов применяются метасимволы, образующие пару квадратных скобок []. Внутри квадратных скобок должно быть задано множество символов, любой из которых может присутствовать в данной позиции входной строки. При этом следует учитывать, что внутри квадратных скобок класса символов большая часть метасимволов игнорируется. Специальными являются только три символа: обратная дробная черта (\), дефис (-) и циркумфлекс (^). Причем метасимвол (^) имеет различный специальный смысл внутри класс символов и вне его границ.
Генератор LEX поддерживает различные способы спецификации множества символов класса. Можно специфицировать перечислительный, интервальный и инвертированный классы символов. Допустимо также комбинировать различные способы спецификации в пределах одного класса символов.
Наиболее простой, но не всегда возможный и рациональный способ – перечислить допустимые символы класса внутри квадратных скобок. Например, необходимо выделять во входном потоке слова GRAY или GREY, которые почти одинаковы, но отличаются только одной буквой. Для решения этой проблемы может быть применено следующее регулярное выражение, где используется символьный класс [EA], состоящий из букв E и A:

GR[EA]Y

Это регулярное выражение позволяет интерпретировать входной поток следующим образом: найти символ G, за которым следует символ R, после которого должен быть символ E либо символ A, и все это завершается символом Y. Кажется целесообразным отметить, что в данном случае вместо класса символов можно применить операцию объединения и построить следующее регулярное выражение:

GRAY|GREY

Это регулярное выражение также как и предыдущая конструкция с классом символов обеспечивает выбор любого из двух допустимых альтернативных вариантов входного слова: GRAY или GREY.
Таким образом, оба рассмотренных регулярных выражения гарантируют аналогичную обработку входного потока. Однако этот пример не может быть распространен на общий случай по следующей причине. Класс символов всегда совпадает ровно с одним символом, каким бы длинным или коротким не был список допустимых литералов. С другой сторону операция объединения может содержать альтернативы произвольной длины, совершенно не связанные между собой длиной текста. Например, следующее регулярное выражение образуется объединением трех альтернатив различной длины, которые лексически не связаны друг с другом:

1\.000\.000|million|"thousand thousand"

Кроме того, конструкция класса символов позволяет реализовать такие возможности выбора, которые не доступны для операции объединения, в частности, спецификация интервальных и инвертированных символьных классов.
Интервальный класс символов удобно применять, когда коды ASCII символов класса образуют непрерывную возрастающую последовательность. В этом случае класс символов можно задать в форме интервала, где первый и последний символы разделяет дефис, который в таком контексте становится метасимволом класса. Например, следующее регулярное выражение определяет класс символов, состоящий из строчных латинских букв:

[a-z]

При этом в классе символов может быть задано произвольное число интервалов. Например, следующее регулярное выражение образует класс символов, в котором специфицировано три интервала:

[0-9a-fA-F]

Это регулярное выражение предоставляет сокращенную форму записи следующей перечислительной спецификации класса символов:

[0123456789abcdefABCDEF]

Оба рассмотренных регулярных выражения эквивалентны и могут быть полезны для обработки чисел в позиционной системе счисления по основанию 16.
Как отмечалось выше, допустимо комбинировать различные формы спецификации в пределах одного класса символов. Например, следующее регулярное выражение определяет комбинированный класс символов, который состоит из цифр, латинских букв и знака подчеркивания:

[0-9a-zA-Z_]

Следует отметить, что диапазоны символов и отдельные литералы в классе могут задаваться в любом порядке. В частности, следующее регулярное выражение эквивалентно предыдущему:

[0-9a-z_A-Z]

Использование знака дефиса между двумя символами, не являющимися только прописными, только строчными или только цифрами, зависит от реализации и обычно приводит к выдаче предупреждающего сообщения. Если символ дефис должен входить в определяемый класс, его нужно поместить или первым или последним. Например, следующее регулярное выражение удовлетворяют любой цифре, а также знакам плюс и минус:

[-+0-9]

В данной транскрипции, также как за границами класса символов, дефис интерпретируется как обычный литерал.

В некоторых случаях более удобно задать символьный класс, указав символы, которые не могут принадлежать ему. Для специфицирования таких инвертированных классов применяется метасимвол ^ (циркумфлекс), который должен быть первым символом после открывающей квадратной скобки. Его использование иллюстрирует следующее регулярное выражение:

[Qq][^u]

Это регулярное выражение может быть полезно для поиска слов английского языка, где после буквы q или Q стоит любая буква, кроме u. Вряд ли такие слова могут быть найдены, если исключить из рассмотрения специальные термины, имена или географические названия.
Аналогичным образом метасимвол ^ позволяет инвертировать интервальный класс, когда целесообразно исключить диапазон символов. Например, следующее регулярное выражение удовлетворяет любому символу, не являющемуся цифрой и прописной или строчной латинской буквой:

[^0-9a-zA-Z]

Необходимо уточнить, что метасимвол циркумфлекс имеет другой специальный смысл за пределами класса символов, где он обеспечивает привязку к началу строки. Следует также учитывать, что в классе символов он теряет свой специальный смысл и интерпретируется как обычный текстовый символ, когда занимает в квадратных скобках любую позицию, кроме первой.
Циркумфлекс и дефис – типичные примеры множественной интерпретации метасимволов регулярных выражений. Их интерпретация зависит от контекста, в котором они используются в регулярном выражении. Единственным метасимволом регулярных выражений, который сохраняет без изменений свою специфику в классе символов является символ обратной дробной черты.
Обратная дробная черта (\) в классе символов сохраняет специальный смысл экранирующей металитеры для любого символа в квадратных скобках. Это означает, что любой символ в квадратных скобках, перед которым стоит метасимвол обратной дробной черты, рассматривается буквально. По очевидным причинам в большинстве случаев экранирование в символьном классе не имеет практической значимости, кроме ситуации, когда в символьный класс нужно включить сам символ обратной дробной черты или литеральные константы, обозначающие, в частности, символы перевода строки и горизонтальной табуляции. Например, следующее регулярное выражение задает символьный класс, состоящий из управляющих символов горизонтальной табуляции и перевода строки:

[\t\n]

Особенности интерпретации метасимволов в символьных классах распространяются также на символ пробела, который хотя и не является метасимволом, но в то же время при вставке пробела в регулярное выражение его необходимо экранировать. Следует обратить внимание на то, что символ пробела не требуется экранировать в классе символов, как это необходимо за его пределами. Например, в следующем регулярном выражении для спецификации пробела используется символьный класс, множество допустимых символов которого состоит только из одного символа пробела:

Lexical[ ]analysis

Во многих практических случаях требуется задать предельно широкий класс символов, который допускает использовать в данной позиции входной строки любой символ, кроме символа перевода строки. Для достижения этого эффекта предусмотрен отдельный метасимвол, который обозначает знак точка (.). Отсутствие в этом классе символа перевода строки объясняется строчной организацией входного потока, при которой символ перевода строки является естественным ограничителем входной информации, поступающей из потока стандартного ввода.
Когда требуется выделить во входном потоке любой символ, включая символ перевода строки, можно использовать следующее регулярное выражение с конструкцией выбора:

.|\n

Завершая анализ возможностей символьных классов, следует отметить, что классы символов можно рассматривать как своеобразный мини-язык регулярных выражений. Правила, определяющие состав и функции поддерживаемых метасимволов, внутри и за пределами класса символов полностью различны.