提问人:John Batdorf 提问时间:1/10/2009 最后编辑:nhahtdhJohn Batdorf 更新时间:1/12/2014 访问量:47884
正则表达式模式 - 允许字母数字,一堆特殊字符,但不允许特定的字符序列
Regex Pattern - Allow alpha numeric, a bunch of special chars, but not a certain sequence of chars
问:
我有以下正则表达式:
(?!^[&#]*$)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$
因此,允许 A-Z、a-Z、0-9 和这些特殊字符'.,&@:?!()$#/\
如果按此顺序在字符串中的任何位置遇到以下字符集,我想不匹配:
&#
当我仅使用“&#”作为输入运行此正则表达式时,它与我的模式不匹配,我收到错误,太好了。当我运行正则表达式时,它确实与我的模式匹配,没有错误。'.,&@:?!()$#/\ABC123
但是,当我使用以下命令运行它时:
'.,&#@:?!()$#/\ABC123
它也不会出错。我在检查&#序列时做错了。
有人能告诉我我做错了什么吗,我不擅长这些事情。
答:
我实际上会分两部分来做:
- 检查允许的字符集。为此,我会查找不允许的字符,如果匹配,则返回 false。这意味着我有一个很好的简单表达:
[^A-Za-z0-9'\.&@:?!()$#^]
- 检查您被禁止的子字符串。由于它只是一个子字符串,我甚至可能不会为该部分使用正则表达式。
你没有提到你的语言,但如果在 C# 中:
bool IsValid(string input)
{
return !( input.Contains("&#")
|| Regex.IsMatch(@"[^A-Za-z0-9'\.&@:?!()$#^]", input)
);
}
评论
假设 Perl 兼容 RegExp
要与字符串“&#”不匹配,请执行以下操作:
(?![^&]*&#)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$
尽管您不需要括号,因为您正在匹配整个字符串。
^((?!&#)[A-Za-z0-9-'.,&@:?!()$#/\\])*$
请注意,最后一个 \ 被转义(加倍)
SO 会自动变成 \ 如果不是反引号\\
借用一种匹配带引号的字符串的技术,从字符类中删除,添加一个替代项,即不后跟 ,并允许字符串可以选择以 :&
&
#
&
^((?:[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-'.,&@:?!()$#/\\]+$
请注意,斜杠字符由双斜杠表示。
该字符表示至少有一个正在测试的字符必须与正则表达式匹配;如果可以传递长度为零的字符串,请将 替换为 .+
+
*
评论
仅供参考,尽管 Ben Blank 的正则表达式有效,但它比它需要的要复杂得多。我会这样做:
^(?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&(?!#))+$
因为我使用了否定的前瞻而不是否定的字符类,所以正则表达式不需要任何额外的帮助来匹配字符串末尾的 & 符号。
上一个:PHP/mysql数组搜索算法
评论