Шаблон регулярных выражений - допускает буквенно-цифровое отображение, набор специальных символов, но не определенную последовательность символов.
-
06-07-2019 - |
Вопрос
У меня есть следующее регулярное выражение:
(?!^[&#]*$)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$
Поэтому разрешите A-Z, a-Z, 0-9 и эти специальные символы '.,&@:?!()$#/\
Я хочу НЕ совпадать, если следующий набор символов встречается где-либо в строке в таком порядке:
&#
Когда я запускаю это регулярное выражение только с "&#" в качестве входных данных, оно не соответствует моему шаблону, я получаю сообщение об ошибке, отлично.Когда я запускаю регулярное выражение с помощью '.,&@:?!()$#/\ABC123
Это соответствует моему шаблону, ошибок нет.
Однако, когда я запускаю его с:
'.,&#@:?!()$#/\ABC123
Это тоже не приводит к ошибке.Я делаю что-то не так с проверкой последовательности &#.
Кто-нибудь может сказать мне, что я сделал не так, я не силен в этих вещах.
Решение
Заимствуя метод сопоставления строк, заключенных в кавычки, удалите &
из вашего класса персонажей добавьте альтернативу для &
нет за которым следует #
, и разрешить строке необязательно заканчиваться на &
:
^((?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&[^#])*&?)$
Другие советы
Я бы сделал это в двух частях:
<Ол><Код> [^ A-Za-z0-9' \ & амп; @:.?! () $ # ^] Код>
Вы не упомянули свой язык, но если в C #:
bool IsValid(string input)
{
return !( input.Contains("&#")
|| Regex.IsMatch(@"[^A-Za-z0-9'\.&@:?!()$#^]", input)
);
}
^((?!&#)[A-Za-z0-9-'.,&@:?!()$#/\\])*$
обратите внимание, что последнее \ экранировано (удвоено)
ПОЭТОМУ автоматически превращается \\
в \ если не в обратных значках
Предполагается, что Perl-совместимый RegExp
Не совпадать со строкой '& amp; #':
<код> (?! [^ & Амп;] * & амп; #) ^ ([A-Za-z0-9 -», & амп; @:. () $ # / \\?] *) $ код>
Хотя вам не нужны скобки, потому что вы соответствуете всей строке.
Просто к вашему сведению, хотя регулярное выражение Бена Бланка работает, оно сложнее, чем должно быть. Я бы сделал это так:
^(?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&(?!#))+$
Поскольку я использовал отрицательный взгляд вместо класса отрицательных символов, регулярное выражение не нуждается в дополнительной помощи для сопоставления с амперсандом в конце строки.
Я бы рекомендовал использовать два регулярных выражения в условном:
if (string has sequence "&#")
return false
else
return (string matches sequence "A-Za-z0-9-'.,&@:?!()$#/\")
Я полагаю, что ваше второе "главное" регулярное выражение
^([A-Za-z0-9-'.,&@:?!()$#/\])$"
имеет несколько ошибок:
- Он будет тестировать только один символ в вашем наборе
- Тот Самый
\
символ в регулярных выражениях - это токен, указывающий на то, что следующий символ является частью какого-то "класса" символов (напр.\n
= - символ перевода строки).Последовательность символов\]
на самом деле это приводит к тому, что ваш список в квадратных скобках не завершается.
Возможно, вам будет лучше использовать
^[A-Za-z0-9-'.,&@:?!()$#/\\]+$
Обратите внимание, что символ косой черты представлен двойной косой чертой.
Тот Самый +
символ указывает, что по крайней мере один проверяемый символ должен соответствовать регулярному выражению;если можно передать строку нулевой длины, замените +
с помощью *
.