Regex для пользовательской проверки в ruby

0

См. В моем приложении Ruby on Rails выражение Regex используется для проверки, выполняемого с помощью механизма проверки jQuery. Итак, мне нужно регулярное выражение для пользовательских требований,

Мое требование:

  1. Он должен содержать только алфавиты, числа, специальные символы #, _, -, (,),., * И пробелы.

  2. Он должен начинаться с алфавита или числа или специальных символов # OR *

  3. Он должен заканчиваться алфавитом или номером или специальными символами . ИЛИ )

  4. Он не должен допускать последовательные специальные символы

  5. Он должен проверить, что для любых стартовых скобок '(', есть закрывающие круглые скобки ')'

  6. Он должен ограничивать всю длину символа до 25

Я попробовал следующее выражение в rubular.com:

/^([a-zA-Z]|\d|\#|\*)(([a-zA-Z]*\d*\(?\)?\-?\.?)*)([a-zA-Z]|\d|\)|\.)$/

Но для указанного выше выражения,

Это позволит использовать комбинации, такие как '*)', '()','*.' и т.д. Он должен иметь по крайней мере символ или номер между специальными символами. Кроме того, теперь он не будет проверять наличие скобок '(' хотя мы и вводим ')'. Итак, это проблемы.

Может кто-нибудь просто мне помочь.

  • 1
    @sawa: "? <> ',? []} {= -) (* & ^% $ #` ~ {} "это специальные символы, и я дал все символы sp., которые я хотел бы разрешить. Надежда это понятно для тебя.
  • 1
    Что значит "есть проблемы"? Что конкретно не работает? Можете ли вы дать контрпримеры, которые проходят там, где они не должны, или терпят неудачу, где они должны быть правильными? Без этого это ленивый вопрос, сваливающий большую часть работы на других людей. Вы должны сделать ваши вопросы как можно более понятными и ответить на них. Смотрите здесь: stackoverflow.com/help/how-to-ask
Показать ещё 5 комментариев

1 ответ

1
Лучший ответ

Возможно, можно закодировать все правила в одно регулярное выражение, но правила для запуска символов, последовательных символов, парных скобок и общей длины объединились бы, чтобы сделать очень сложный код и трудно читаемое регулярное выражение ( общая сложность ваших требований приближается к необходимости решения на основе грамматики - например, анализатора).

Я предлагаю кодировать несколько тестов проверки, некоторые из которых основаны на регулярных выражениях и проверяют их последовательно.

Вы можете начать с ваших позиций 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 будет достаточно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню