Шаблон регулярных выражений - Разрешить буквенно-цифровой, набор специальных символов, но не определенную последовательность символов - PullRequest
2 голосов
/ 10 января 2009

У меня есть следующее регулярное выражение:

(?!^[&#]*$)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$

Итак, допустим A-Z, a-Z, 0-9 и эти специальные символы '.,&@:?!()$#/\

Я не хочу совпадать, если в строке в этом порядке встречается следующий набор символов:

&#

Когда я запускаю это регулярное выражение только с "& #" в качестве входных данных, оно не соответствует моему шаблону, я получаю ошибку, отлично. Когда я запускаю регулярное выражение с '.,&@:?!()$#/\ABC123 Это соответствует моему шаблону, без ошибок.

Однако, когда я запускаю его с:

'.,&#@:?!()$#/\ABC123

Это тоже не ошибка. Я делаю что-то не так с проверкой последовательности & #.

Может кто-нибудь сказать мне, что я сделал неправильно, я не очень хорош в этих вещах.

Ответы [ 6 ]

5 голосов
/ 10 января 2009

Заимствуя технику для сопоставления строк в кавычках, удалите & из вашего класса символов, добавьте альтернативу для & , а не , за которой следует #, и позвольте строке необязательно заканчиваться &:

^((?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&[^#])*&?)$

1 голос
/ 10 января 2009

Я бы сделал это в двух частях:

  1. Проверьте допустимый набор символов. Для этого я бы искал символы, которые не разрешены, и возвращал бы false, если есть совпадение. Это означает, что у меня есть хорошее простое выражение:
    [^A-Za-z0-9'\.&@:?!()$#^]
  2. Проверьте вашу запрещенную подстроку. А так как это просто подстрока, я бы даже не использовал регулярное выражение для этой части.

Вы не упомянули свой язык, но если в C #:

bool IsValid(string input)
{
    return !(   input.Contains("&#")  
               || Regex.IsMatch(@"[^A-Za-z0-9'\.&@:?!()$#^]", input) 
            );
}
0 голосов
/ 10 января 2009

Просто к вашему сведению, хотя регулярное выражение Бена Бланка работает, оно сложнее, чем должно быть. Я бы сделал это так:

^(?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&(?!#))+$

Поскольку вместо отрицательного класса символов я использовал отрицательный взгляд, регулярное выражение не нуждается в дополнительной помощи для сопоставления амперсанда в конце строки.

0 голосов
/ 10 января 2009

Я бы рекомендовал использовать два регулярных выражения в условном выражении:

    if (string has sequence "&#")
      return false
    else
      return (string matches sequence "A-Za-z0-9-'.,&@:?!()$#/\")

Я полагаю, ваше второе "основное" регулярное выражение

^([A-Za-z0-9-'.,&@:?!()$#/\])$"

имеет несколько ошибок:

  • Он будет проверять только один символ в вашем наборе
  • Символ \ в регулярных выражениях является токеном, указывающим, что следующий символ является частью некоторого типа «класса» символов (например, \n = является символом перевода строки). Последовательность символов \] фактически приводит к тому, что ваш список в скобках не завершается.

Возможно, вам лучше воспользоваться

^[A-Za-z0-9-'.,&@:?!()$#/\\]+$

Обратите внимание, что символ косой черты представлен двойной косой чертой.

Символ + указывает, что хотя бы один тестируемый символ должен соответствовать регулярному выражению; если можно передать строку нулевой длины, замените + на *.

0 голосов
/ 10 января 2009

^((?!&#)[A-Za-z0-9-'.,&@:?!()$#/\\])*$

обратите внимание, что последний \ экранирован (удвоен) ТАК автоматически превращает \\ в \ если не в кавычки

0 голосов
/ 10 января 2009

Предполагается, что Perl-совместимый RegExp

Чтобы не совпадать в строке '& #':

(?![^&]*&#)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$

Хотя вам не нужны скобки, потому что вы соответствуете всей строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...