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