Использование регулярных выражений
From LimeSurvey Manual
Регулярные выражения должны начинаться и заканчиваться косой чертой («/»). Хорошую библиотеку регулярных выражений можно найти на сайте https://www.regexlib.net/. Эти шаблоны почти всегда работают, если заключить их в косые черты.
Чтобы протестировать регулярное выражение, можно воспользоваться этим тестером регулярных выражений.
Важно: регулярные выражения в условиях
Обратите внимание: при использовании регулярных выражений в редакторе условий НЕ добавляйте начальную и конечную косую черту.
Проверка e-mail
Обновление (12/2018): поскольку в настоящее время доменные имена могут содержать не только специальные символы, например «ü», но и состоять из более чем 3 символов, например .tech или .company, приведённое ниже регулярное выражение для e-mail проверяет только наличие символов «@» и «.» в введённом адресе электронной почты.
/^.+?@.+?\..+$/
Если требуется проверять по одному адресу в каждой строке в многострочном поле длинного текста:
/^(((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*(\r\n)?\n?)+)*)$/
В этом устаревшем регулярном выражении доменное имя ограничено 3 символами, что не охватывает все доступные домены:
/^(\w[-._+\w]*\w@\w[-._\w]*\w\.\w{2,3})$/
Почтовые индексы
Почтовые индексы Австралии:
/^[0-9]{4}/
Почтовые индексы Бразилии
/^[0-9]{2}\.[0-9]{3}-[0-9]{3}$/
Почтовые индексы Канады
/^[a-zA-Z]\d{1}[a-zA-Z](\-| |)\d{1}[a-zA-Z]\d{1}$/
Почтовые индексы США
/^[0-9]{5}([- /]?[0-9]{4})?$/
Чтобы почтовый индекс мог начинаться с нуля, используйте:
/^[0-9]{5}(?:-[0-9]{4})?$/
Почтовые индексы Великобритании
/^[A-Z][A-Z]?[0-9][A-Z0-9]? ?[0-9][ABDEFGHJLNPQRSTUWXYZ]{2}$/i
Обратите внимание: это выражение не очень точное, а более точная проверка значительно сложнее. Дополнительную информацию см., например, в ответе на StackOverflow и на Википедии.
Почтовые индексы Франции
/(^[0-8]\d\d{3}$)|(^9[0-5]\d{3}$)|(^97[1-6]\d{2}$)|(^98[46-8]\d{2}$)/
Приведённое выше выражение очень точное: оно проверяет, существует ли французский департамент (первые две цифры), включая заморские департаменты и заморские территории (DOM-TOM).
Номера телефонов
Телефонные номера США
/^(?:\([2-9]\d{2}\)\ ?|[2-9]\d{2}(?:\-?|\ ?))[2-9]\d{2}[- ]?\d{4}$/
или
/^[\(\)\.\- ]{0,}[0-9]{3}[\(\)\.\- ]{0,}[0-9]{3}[\(\)\.\- ]{0,}[0-9]{4}[\(\)\.\- ]{0,}$/
Этот второй вариант соответствует всем телефонным номерам Канады и США, содержащим нецифровые символы, в том числе:
. ( ) - (space)
Это позволит находить телефонные номера, похожие на следующие:
- (555)555 5555
- 555.555.5555
- 555 555 5555
- (555)-555-5555
- 555-555-5555
- 555555555
Телефонные номера Австралии
Следующие шаблоны соответствуют различным австралийским номерам мобильных и стационарных телефонов, в том числе с кодом страны «+61»:
- (02) 9123 6535
- 03 1234-5345
- 0412 345 678
- +61 2 3456 789
Но не соответствуют:
- 234 3450 234
- a234 534 3432
- 134567
- 123456789013
Скобки, пробелы и дефисы игнорируются.
Версии «Very precise:» («Очень точно»), приведённые здесь, проверяют первые четыре или пять цифр номера, чтобы убедиться, что это действительные австралийские номера.
Версии «Not very precise:» («Не очень точно») проверяют только первую и вторую цифры, поэтому могут допускать недействительные номера.
Все телефонные номера Австралии (мобильные и стационарные — код региона обязателен)
Очень точно:
/^\(?(?:\+?61|0)(?:(?:2\)?[ -]?(?:3[ -]?[38]|[46-9][ -]?[0-9]|5[ -]?[0-35-9])|3\)?(?:4[ -]?[0-57-9]|[57-9][ -]?[0-9]|6[ -]?[1-67])|7\)?[ -]?(?:[2-4][ -]?[0-9]|5[ -]?[2-7]|7[ -]?6)|8\)?[ -]?(?:5[ -]?[1-4]|6[ -]?[0-8]|[7-9][ -]?[0-9]))(?:[ -]?[0-9]){6}|4\)?[ -]?(?:(?:[01][ -]?[0-9]|2[ -]?[0-57-9]|3[ -]?[1-9]|4[ -]?[7-9]|5[ -]?[018])[ -]?[0-9]|3[ -]?0[ -]?[0-5])(?:[ -]?[0-9]){5})$/
Не очень точно:
/^(?:\+?61|0)[2-478](?:[ -]?[0-9]){8}$/
Все стационарные телефонные номера Австралии (код региона обязателен)
Очень точно:
/^\(?(?:\+?61|0)(?:2\)?[ -]?(?:3[ -]?[38]|[46-9][ -]?[0-9]|5[ -]?[0-35-9])|3\)?(?:4[ -]?[0-57-9]|[57-9][ -]?[0-9]|6[ -]?[1-67])|7\)?[ -]?(?:[2-4][ -]?[0-9]|5[ -]?[2-7]|7[ -]?6)|8\)?[ -]?(?:5[ -]?[1-4]|6[ -]?[0-8]|[7-9][ -]?[0-9]))(?:[ -]?[0-9]){6}$/
Не очень точно:
/^(?:\+?61|\(?0)[2378]\)?(?:[ -]?[0-9]){8}$/
Стационарные телефонные номера Нового Южного Уэльса (код региона необязателен)
Очень точно:
/^(?:\(?(?:\+?61|0)2\)?[ -]?)?(?:3[ -]?[38]|[46-9][ -]?[0-9]|5[ -]?[0-35-9])(?:[ -]?[0-9]){6}$/
Не очень точно:
/^(?:\(?(?:\+?61|0)2\)?(?:[ -]?[0-9]){7}[0-9]$/
Стационарные телефонные номера Виктории и Тасмании (код региона необязателен)
Очень точно:
/^(?:\(?(?:\+?61|0)3\)?[ -]?)?(?:4[ -]?[0-57-9]|[57-9][ -]?[0-9]|6[ -]?[1-67])(?:[ -]?[0-9]){6}$/
Менее точный вариант:
/^(?:\(?(?:\+?61|0)3\)?(?:[ -]?[0-9]){7}[0-9]$/
Номера стационарных телефонов Квинсленда (код города необязателен)
Очень точный вариант:
/^(?:\(?(?:\+?61|0)7\)?[ -]?)?(?:[2-4][ -]?[0-9]|5[ -]?[2-7]|7[ -]?6)(?:[ -]?[0-9]){6}$/
Менее точный вариант:
/^(?:\(?(?:\+?61|0)7\)?(?:[ -]?[0-9]){7}[0-9]$/
Номера стационарных телефонов Южной Австралии, Северной территории и Западной Австралии (код города необязателен)
Очень точный вариант:
/^(?:\(?(?:\+?61|0)8\)?[ -]?)?(?:5[1-4]|6[0-8]|[7-9][0-9])$/
Менее точный вариант:
/^(?:\(?(?:\+?61|0)8\)?(?:[ -]?[0-9]){7}[0-9]$/
Только номера мобильных телефонов Австралии
Очень точный вариант:
/^(?:\+?61|0)4 ?(?:(?:[01] ?[0-9]|2 ?[0-57-9]|3 ?[1-9]|4 ?[7-9]|5 ?[018]) ?[0-9]|3 ?0 ?[0-5])(?: ?[0-9]){5}$/
Менее точный вариант:
/^(?:\(?(?:\+?61|0)4\)?(?:[ -]?[0-9]){7}[0-9]$/
Телефонный номер Бельгии
/^((\+|00)32\s?|0)(\d\s?\d{3}|\d{2}\s?\d{2})(\s?\d{2}){2}$/
Номер мобильного телефона Бельгии
/^((\+|00)32\s?|0)4(60|[789]\d)(\s?\d{2}){3}$/
Телефонный номер Франции
/^((\+|00)33\s?|0)[1-59](\s?\d{2}){4}$/
Номер мобильного телефона Франции
/^((\+|00)33\s?|0)[67](\s?\d{2}){4}$/
Телефонный номер Люксембурга
/^((\+|00\s?)352)?(\s?\d{2}){3,4}$/
Номер мобильного телефона Люксембурга
/^((\+|00\s?)352)?\s?6[269]1(\s?\d{3}){2}$/
Немецкие оценки (с необязательным плюсом или минусом)
/^[1-6]{1}[\+|\-]?$/
Проверка возраста
Пример: возраст 20–99
/([2-9][0-9])/
Пример: возраст 18–35
/(1[8-9]|2[0-9]|3[0-5])/
Пример: возраст 19–65
/^(1[8-9]|[2-5][0-9]|6[0-5])$/
Проверка числа
Числа от 1 до 99999
/^([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9])$/
/^[1-9][0-9]{0,4}$/ does the same as above but should run a little faster
Числа от 1 до 999, от 1.000 до 999.999 и до 999.999.999
/^[1-9][0-9]{0,2}(?:\.[0-9]{3}){0,2}$/
Принимает числа от 1 до 999, от 1.000 до 999.999 и до 999.999.999, но отклоняет числа вроде 999.1.1 , 94.22.22, 999.1.22, 999.11.1, 999.1.333
Проверка числа с необязательной десятичной частью (для цены)
Принимает числа от 0 до 199 с необязательными двумя десятичными знаками:
/^([1][0-9][0-9]|[1-9][0-9]|[0-9])((\.)[0-9][0-9])?$/
Проверка числа с разделителем тысяч
Пробел в качестве разделителя, без минуса
/^(?!0)\d{1,3}(\ \d{3})*$/
Точка в качестве разделителя, минус разрешён
/^-?(?!0)\d{1,3}(\.\d{3})*$/
Требует два десятичных знака и принимает числа от 1.00 до 999,999,999.00 с необязательной запятой в качестве разделителя тысяч/миллионов, в том числе все следующие: 1.00, 1,000.00, 12,345.67, 12345,02, 123,456,468.00, 1234566.00, 123456789.00, но не 1,23.00, 12,3.4 или 1234,43.04
/^[1-9][0-9]{0,2}(?:,?[0-9]{3}){0,3}\.[0-9]{2}$/
Аналогично предыдущему: требует два десятичных знака, но принимает "0" перед десятичным разделителем ",".
/[0-9]{0,2}(?:,?[0-9]{3}){0,3}\.[0-9]{2}$/
То же, что выше, но два десятичных знака необязательны:
/^[1-9][0-9]{0,2}(?:,?[0-9]{3}){0,3}(?:\.[0-9]{2})?$/
Месяц (1–12)
Если вы хотите спросить, в каком месяце родился человек, можно выполнить проверку введённого значения следующим образом:
/^[0]*[1-9]$|^[0]*1[0-2]$/
Минимальная ширина (в этом примере задано значение 3)
/^.{3,}$/
Валюта
Валюта США (знак доллара и центы необязательны)
/^\$?\d+(\.(\d{2}))?$/
Проверка использования запятой:
/^\$?\d{1,3}(\d+(?!,))?(,\d{3})*(\.\d{2})?$/
Швейцарская цена
Число с двумя знаками после запятой, последний из которых равен 5 или 0:
/^(\d+)(\.\d(05)?)?$/
Проверка оценки
1-10
/^[1-9]{1}$|^10$/
1-100
/^[1-9]?[0-9]{1}$|^100$/
Проверка текста
Тип вопроса «Несколько коротких текстов» в настоящее время не поддерживает минимальное или максимальное количество ответов. Один из способов обойти это ограничение — использовать тип вопроса «Длинный произвольный текст» с регулярным выражением.
Приведённое ниже выражение проверяет наличие хотя бы одного слова в каждой строке, при этом строк должно быть не менее 3 и не более 10:
/(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)){2,10}/is
Если вам нужно, скажем, пять слов в каждой строке, можно заменить первую и последнюю звёздочку на {4,}:
/(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+){4,})(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+){4,})){2,10}/is
Если вам нужно одно или несколько слов в строке (от 1 до 5 строк), измените содержимое последних фигурных скобок на 0,4 (обратите внимание: используется 0, так как первая строка уже учтена).
/(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)(?:[,.;:?!& \n\r]?(?:\n|\r|\n\r|\r\n)(?:[^,.;:?!& \n\r]+(?: [^,.;:?!& \n\r]+)*)){0,4}/is
Количество слов
Следующее выражение ограничивает количество слов: минимум 1 и максимум 200:
/^[-\w]+(?:\W+[-\w]+){0,199}\W*$/
Чтобы увеличить минимум, измените нулевую часть в {0,199}.
Чтобы увеличить или уменьшить максимум, измените часть «199» в {0,199}.
Проверка времени
Существует множество способов записи формата времени. Среди возможных вариантов — 12-часовой или 24-часовой формат, с секундами или без них. Хотя можно использовать тип вопроса «Дата» (он также может фиксировать время), вы можете применить тип вопроса «Короткий произвольный текст» с одним из приведённых ниже регулярных выражений для проверки.
Следующие три строки проверки соответствуют 24-часовому формату времени (по порядку): без секунд, с необязательными секундами и, наконец, с обязательными секундами:
/^(?:[01][0-9]|2[0-3]):[0-5][0-9]$/
/^(?:[01][0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?$/
/^(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/
Следующие три выражения соответствуют 12-часовому формату времени: как выше, с секундами, с необязательными секундами и с обязательными секундами:
/^(?">00:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9] (?:pm|PM))$/
/^(?:00:[0-5][0-9](?::[0-5][0-9])? (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9](?::[0-5][0-9])? (?:[ap]m|[AP]M)|12:[0-5][0-9](?::[0-5][0-9])? (?:pm|PM))$/
/^(?:00:[0-5][0-9]:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9]:[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9]:[0-5][0-9] (?:pm|PM))$/
Следующие три выражения соответствуют как 12-часовому, так и 24-часовому формату времени: как выше, с секундами, с необязательными секундами и с обязательными секундами:
/^(?:(?:00:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9] (?:pm|PM))|(?:[01][0-9]|2[0-3]):[0-5][0-9])$/
/^(?:(?:00:[0-5][0-9](?[0-5][0-9])? (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9](?[0-5][0-9])? (?:[ap]m|[AP]M)|12:[0-5][0-9](?[0-5][0-9])? (?:pm|PM))|(?:[01][0-9]|2[0-3]):[0-5][0-9](?[0-5][0-9])?)$/
/^(?:(?:00:[0-5][0-9]:[0-5][0-9] (?:am|AM)|(?:0[1-9]|1[01]):[0-5][0-9]:[0-5][0-9] (?:[ap]m|[AP]M)|12:[0-5][0-9]:[0-5][0-9] (?:pm|PM))|(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9])$/
Штаты США
Чтобы выполнить проверку для одного штата, используйте следующие выражения (в примере — Техас):
- TX — только заглавные буквы:
/^(TX)$/
- tx — только строчные буквы:
/^(tx)$/
- TX — заглавные или строчные буквы:
/^([T|t][X|x])$/
Фильтр ненормативной лексики
Чтобы отфильтровать ненормативную лексику в ответе:
/^(?i)((?!\bENTERPROFANITYHERE\b).)*$(?-i)/
Замените «ENTERPROFANITYHERE» на нежелательное слово.
Метасимвол \b позволит пропускать такие слова, как «assassination» и «hello», если в качестве нежелательного слова вы укажете «ass» или «hell». Это также работает, если вы хотите исключить из ответов другие слова, имена и т. д.
Полезные ссылки
В начале этого раздела вики мы рекомендуем использовать https://regex101.com/ для проверки и создания регулярных выражений. Если первый вариант вам не подходит, можно также воспользоваться https://www.regextester.com/ для создания выражений. Для визуализации регулярных выражений можно использовать https://extendsclass.com/regex-tester.html.