Ответы пользователя в открытых ответах, а также в полях и в выпадающих списках сравниваются с шаблоном (иногда он называется маской), который формируется в соответствии с правилами регулярных выражений. Приведем некоторые сведения и примеры, упрощающие формирование шаблонов.
Частью шаблона не могут быть некоторые символы, которые используются в качестве служебных – круглые, квадратные и фигурные скобки, вертикальная черта, косая черта, обратная косая черта, точка, вопросительный знак, звездочка, плюс, знак доллара и знак ^. Если же один из этих знаков должен быть частью шаблона, то он должен быть экранирован обратной косой чертой. Например:
Шаблон |
Верный ответ |
Мама мыла раму\. |
Мама мыла раму. |
В случае, когда может быть несколько верных ответов, они могут быть приведены последовательно с использованием разделяющего символа – вертикальной черты, например:
Шаблон |
Варианты верного ответа |
Мама мыла раму\.|Мама раму мыла\.|Раму мыла мама\. |
Мама мыла раму. Мама раму мыла. Раму мыла мама. |
Такой шаблон достаточно нагляден, однако при большом количестве вариантов легко выйти за рамки его максимальной длины (512 символов), поэтому целесообразно учесть, что первые два варианта верного ответа начинаются со слова Мама и пробела, и использовать скобки для ограничения действия символа альтернативы:
Шаблон |
Варианты верного ответа |
Мама (мыла раму|раму мыла)\.|Раму мыла мама\. |
Мама мыла раму. Мама раму мыла. Раму мыла мама. |
В этом случае первое слово Мама вместе со следующим за ним пробелом является частью верного ответа, равно как и точка в конце. Между ними же может стоять одна из альтернатив, приведенных в скобках. Тем самым скобки ограничивают действие символа |.
Продолжим обсуждение нашего примера. Вполне вероятно, что кто-то из пользователей поставит вместо одного пробела между словами не один, а несколько пробелов. Такую возможность также можно учесть: для этого используем условное обозначение пробела – \s, а также знак плюс, означающий «один или более». Таким образом последовательность \s+ означает один или несколько пробелов. Скорректируем наш шаблон:
Шаблон |
Варианты верного ответа |
Мама\s+(мыла\s+раму|раму\s+мыла)\.|Раму\s+мыла\s+мама\. |
Мама мыла раму. Мама мыла раму. Мама мыла раму. Мама раму мыла. Мама раму мыла. Мама раму мыла. Раму мыла мама. Раму мыла мама. |
Наряду с плюсом для указания на число повторений символа или последовательности символов (в последнем случае все символы последовательности должны быть заключены в круглые скобки) могут использоваться также звездочка и вопросительный знак:
Обозначение |
Значение |
+ |
Одно или более повторений |
* |
Ноль или более повторений |
? |
Ноль или одно повторение |
Для другого количества повторений используются фигурные скобки:
Обозначение |
Значение |
{n} |
n повторений |
{n,m} |
От n по m повторений |
{n,} |
n или более повторений |
{,m} |
Не более m повторений |
Обозначение |
Значение |
\s |
пробел |
\S |
любой символ, кроме пробела |
\d |
цифра |
\D |
любой символ, кроме цифр |
. |
любой символ |
Пример: пользователь должен написать сочинение, в котором от 50 до 100 слов. Понятно, что между словами находятся пробелы. До собственно текста сочинения могут стоять пробелы, и это не ошибка, но их может и не быть (\s*), затем идут слова, т.е. один или несколько непробельных символов (\S+) с обязательными пробелами между ними (\s+). Поскольку после последнего слова сочинения пробелы необязательны, указываем, что количество последовательностей «слово+пробел» находится в диапазоне от 49 до 99. Сочинение завершается последним словом (\S+), после которого тоже могут располагаться пробелы, однако на сей раз необязательные (\s+).
\s*(\S+\s+){49,199}\S+\s*
Символьный класс – это последовательность символов в квадратных скобках, он указывает, что корректным является любой символ из последовательности. Например, [Аа] означает, что корректной является как прописная, так и строчная буква А.
В символьных классах допустимо также указание диапазонов, например:
Кроме того при помощи символьного класса возможно указать любой символ, за исключением перечисленных, для этого используется знак ^:
Модификатор (?i) включает нечувствительность к регистру символов, иными словами, шаблон
(?i)мама\s+(мыла\s+раму|раму\s+мыла)\.|раму\s+мыла\s+мама\.
позволяет пользователю вводить текст как прописными, так и строчными буквами, чередуя их в произвольном порядке.
Для выключения режима нечувствительности используется модификатор (?-i).