См. В моем приложении Ruby on Rails выражение Regex используется для проверки, выполняемого с помощью механизма проверки jQuery. Итак, мне нужно регулярное выражение для пользовательских требований,
Мое требование:
Он должен содержать только алфавиты, числа, специальные символы #, _, -, (,),., *
И пробелы.
Он должен начинаться с алфавита или числа или специальных символов #
OR *
Он должен заканчиваться алфавитом или номером или специальными символами .
ИЛИ )
Он не должен допускать последовательные специальные символы
Он должен проверить, что для любых стартовых скобок '(', есть закрывающие круглые скобки ')'
Он должен ограничивать всю длину символа до 25
Я попробовал следующее выражение в rubular.com:
/^([a-zA-Z]|\d|\#|\*)(([a-zA-Z]*\d*\(?\)?\-?\.?)*)([a-zA-Z]|\d|\)|\.)$/
Но для указанного выше выражения,
Это позволит использовать комбинации, такие как '*)', '()','*.'
и т.д. Он должен иметь по крайней мере символ или номер между специальными символами. Кроме того, теперь он не будет проверять наличие скобок '('
хотя мы и вводим ')'
. Итак, это проблемы.
Может кто-нибудь просто мне помочь.
Возможно, можно закодировать все правила в одно регулярное выражение, но правила для запуска символов, последовательных символов, парных скобок и общей длины объединились бы, чтобы сделать очень сложный код и трудно читаемое регулярное выражение ( общая сложность ваших требований приближается к необходимости решения на основе грамматики - например, анализатора).
Я предлагаю кодировать несколько тестов проверки, некоторые из которых основаны на регулярных выражениях и проверяют их последовательно.
Вы можете начать с ваших позиций 1..3 (символы разрешены в начале, середине, конце строки), к которым ваше текущее решение очень близко. Я бы предпочел только классы символов здесь, обратите внимание, что это регулярное выражение предполагает, что строка содержит не менее двух символов в дополнение к перечисленным правилам:
/\A[a-zA-Z0-9\#\*][a-zA-Z0-9\#\*\.\(\)\s\-_]*[a-zA-Z0-9\.\)]\z/
NB Я предпочитаю \A
для начала строки и \z
для конца, но ^
и $
, вероятно, просто отлично подходят для вашего использования.
Следующее регулярное выражение найдет последовательные специальные символы (ваше правило 4), поэтому вы должны его отменить (проверьте с помощью !~
Вместо =~
)
/[\#\*\.\(\)\s\-_]{2}/
Проверка парных скобок (правило 5) выполняется с использованием регулярного выражения. Вместо этого вы должны проверить наличие каких-либо открывающих или закрывающих скобок /[\(\)]/
, и, если они вообще есть, проверьте, что они соединяются с еще одним кодом. См. Этот ответ на аналогичное требование, которое дает алгоритм.
Наконец, для проверки длины (правило 6) вам даже не нужны регулярные выражения. Если ваш вход находится в str
, то str.size <= 25
будет достаточно.