Дефис и Underscore никогда не должны быть непрерывными, но могут присутствовать в строке более одного раза

1

У меня есть требование, когда мне нужно проверить поле в Excel.

Validations:

  1. Поле должно начинаться и заканчиваться [a-zA-Z0-9] но не с любыми специальными [-_]
  2. Он не может содержать "-" и "_" непрерывно более одного раза.
    Пример:
    A--Badasd (не разрешено)
    A__Bsdasdas (Не разрешено)
    A-_fdsfdsd (не разрешено)
    A_-sfsdfsdf (не разрешено)
    AB-adf (разрешено)
    A_b_adads (разрешено)

Я придумал это следующее регулярное выражение, однако он, похоже, не принимает даже непрерывные записи "-" и "_".

^[a-zA-z0-9]+(([\xFF01-\xFF5E]+|[\\-\\_])+)[a-zA-Z0-9]+$

[\xFF01-\xFF5E] должен не допускать символов двойной ширины, поэтому, пожалуйста, игнорируйте его, поскольку он работает нормально.

Любая помощь будет очень заметной.

  • 1
    ^(?!.*[-_]{2})[a-zA-Z0-9][\xFF01-\xFF5E_-]*[a-zA-Z0-9]$ . Или разрешить 1 строку символов, ^(?!.*[-_]{2})[a-zA-Z0-9](?:[\xFF01-\xFF5E_-]*[a-zA-Z0-9])?$
  • 0
    Большое спасибо, это аккуратно. Работал как шарм!
Показать ещё 1 комментарий
Теги:
special-characters
regex-negation

1 ответ

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

Я могу предложить только шаблон, основанный на просмотре (поскольку [\xFF01-\xFF5E] соответствует _ и ограничение его в JS regex сделает шаблон более громоздким):

/^[a-z0-9](?:(?!.*?[-_]{2})[\xFF01-\xFF5E-]*[a-z0-9])?$/i

См. Демо-версию regex.

Этот шаблон будет соответствовать строки длиной 1 полукокса, тоже, и будет соответствовать только те строки, начинающиеся и заканчивающиеся с ASCII буквенно - цифровой полукокса и не имеющих --, _-, -_ и __ в них.

Если вы хотите "блокировать" строки длиной 1, то есть установить минимальную длину совпадения на 2, вы должны удалить (?: И )? из приведенного выше рисунка:

/^[a-z0-9](?!.*?[-_]{2})[\xFF01-\xFF5E-]*[a-z0-9]$/i

подробности

  • ^ - начало строки
  • [a-z0-9] - буквенно-цифровой символ ASCII
  • (?:(?!.*?[-_]{2})[\xFF01-\xFF5E_-]*[a-z0-9])? - необязательная (1 или 0 вхождения) последовательность:
    • (?!.*?[-_]{2}) - контрольная проверка, которая не даст совпадения, если есть 2 последовательных - или _ любом месте после любых символов 0+, кроме символов разрыва строки
    • [\xFF01-\xFF5E-]* - любой символ в диапазоне \xFF01-\xFF5E или/и -
    • [a-z0-9] - буквенно-цифровой символ ASCII
  • $ - конец строки.
  • 0
    Это работает как шарм, однако, я пошел с 1-м предложением, которое вы сделали, которое даже блокирует одиночные строки символов. Просто чтобы быть более строгим в части проверки данных ...
  • 0
    Да, эти требования должны быть размещены в самом вопросе. Но вы можете просто удалить (?: И последний )? и он также будет «блокировать» строки из 1 символа. Я добавил вариант шаблона для строк длиной 2 и до ответа.
Показать ещё 1 комментарий

Ещё вопросы

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