我有以下正则表达式:
(?!^[&#]*$)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$
所以允许A-Z,a-Z,0-9和这些特殊字符'.,&@:?!()$#/\
如果在此字符串中的任何位置遇到以下字符集,我想不匹配:
&#
当我使用“&#”作为输入运行此正则表达式时,它与我的模式不匹配,我收到错误,很棒。当我使用'.,&@:?!()$#/\ABC123
运行正则表达式时它与我的模式匹配,没有错误。
但是当我用它运行时:
'.,&#@:?!()$#/\ABC123
它也没有错误。检查&#sequence。
时,我做错了有人能告诉我我做错了什么,我对这些事情并不好。
答案 0 :(得分:5)
借用匹配引用字符串的技巧,从字符类中删除&
,为&
而不是添加替代#
,并允许字符串,可选地以&
结尾:
^((?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&[^#])*&?)$
答案 1 :(得分:1)
我实际上会分两部分来做:
[^A-Za-z0-9'\.&@:?!()$#^]
您没有提及您的语言,但如果是在C#中:
bool IsValid(string input)
{
return !( input.Contains("&#")
|| Regex.IsMatch(@"[^A-Za-z0-9'\.&@:?!()$#^]", input)
);
}
答案 2 :(得分:0)
假设Perl兼容RegExp
要匹配字符串'&#':
(?![^&]*&#)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$
虽然您不需要括号,因为您匹配整个字符串。
答案 3 :(得分:0)
^((?!&#)[A-Za-z0-9-'.,&@:?!()$#/\\])*$
请注意最后一个\被转义(加倍)
如果没有反引号,则会自动将\\
变为\
答案 4 :(得分:0)
我建议在条件中使用两个正则表达式:
if (string has sequence "&#")
return false
else
return (string matches sequence "A-Za-z0-9-'.,&@:?!()$#/\")
我相信你的第二个“主要”正则表达式
^([A-Za-z0-9-'.,&@:?!()$#/\])$"
有几个错误:
\
字符是一个标记,表示下一个字符是某种“类”字符的一部分(例如\n
=是换行符)。字符序列\]
实际上导致您的括号列表不会被终止。您可能最好使用
^[A-Za-z0-9-'.,&@:?!()$#/\\]+$
请注意,斜杠字符由双斜杠表示。
+
字符表示至少有一个被测试的字符必须与正则表达式匹配;如果可以传递零长度字符串,请将+
替换为*
。
答案 5 :(得分:0)
仅供参考,虽然Ben Blank的正则表达式有效,但它比它需要的更复杂。我会这样做:
^(?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&(?!#))+$
因为我使用了负前瞻而不是否定字符类,所以正则表达式不需要任何额外的帮助来匹配字符串末尾的&符号。