我无法想出一个正则表达式,它基本上会将某些特殊字符列入黑名单.
我需要使用它来验证输入字段中的数据(在Java Web应用程序中).我们希望允许用户输入任何数字,字母(我们需要包括重音字符,例如法语或德语)和一些特殊字符,例如' - .等等
如何将<>%$等字符列入黑名单?
任何帮助将不胜感激.
Dan*_*ner 40
我只是白名单上的人物.
^[a-zA-Z0-9äöüÄÖÜ]*$
Run Code Online (Sandbox Code Playgroud)
使用正则表达式构建黑名单同样简单,但您可能需要添加更多字符 - 在unicode中有很多中文符号...;)
^[^<>%$]*$
Run Code Online (Sandbox Code Playgroud)
表达式[^(这里有很多字符)]只匹配未列出的任何字符.
要排除某些字符(<,>,%和$),您可以制作如下的正则表达式:
[<>%\$]
Run Code Online (Sandbox Code Playgroud)
此正则表达式将匹配其中包含黑名单字符的所有输入.括号定义了一个字符类,并且在美元符号之前是必需的,因为美元符号在正则表达式中具有特殊含义.
要在黑名单中添加更多字符,只需将它们插入括号之间即可; 订单没关系.
Pattern p = Pattern.compile("[<>%\$]");
Matcher m = p.matcher(unsafeInputString);
if (m.matches())
{
// Invalid input: reject it, or remove/change the offending characters.
}
else
{
// Valid input.
}
Run Code Online (Sandbox Code Playgroud)
ASCII 字符的非字母数字和下划线的否定集:
/[^\W]/g
Run Code Online (Sandbox Code Playgroud)
对于电子邮件或用户名验证,我使用了以下允许 4 个标准特殊字符 - _ 的表达式。@
/^[-.@_a-z0-9]+$/gi
Run Code Online (Sandbox Code Playgroud)
对于严格的仅字母数字表达式,请使用:
/^[a-z0-9]+$/gi
Run Code Online (Sandbox Code Playgroud)
测试@ RegExr.com
通常最好将您允许的字符列入白名单,而不是将您不允许的字符列入黑名单.从安全角度和易于实施的角度来看都是如此.
如果你确实沿着黑名单路线走下去,这是一个例子,但要注意,语法并不简单.
http://groups.google.com/group/regex/browse_thread/thread/0795c1b958561a07
如果你想将所有重音字符列入白名单,也许使用unicode范围会有帮助吗?看看这个链接.
http://www.regular-expressions.info/unicode.html
我想这取决于您所针对的语言。通常,这样的事情应该起作用:
[^<>%$]
Run Code Online (Sandbox Code Playgroud)
“ []
”结构定义了一个字符类,它将与列出的任何字符匹配。将“ ^
”作为第一个字符将否定匹配,即:除所列字符中的一个以外的任何其他字符。
[]
根据您使用的语言/正则表达式引擎,您可能需要转义“ ”中的某些字符。
即使在2009年,似乎也有太多人对涉及WORLDWIDE网站的设计抱有非常有限的想法。在2015年,除非为特定国家/地区设计,否则黑名单是容纳可能有效的大量字符的唯一方法。
然后需要根据需要非法使用的数据来选择要列入黑名单的字符。
但是,有时需要分解需求,并分别处理每个需求。提前在这里是你的朋友。这些部分以(?=)
正号和(?!)
负号为界,并有效地成为AND块,因为处理该块时,如果没有失败,则正则表达式处理器将在下一个块的文本开头开始。实际上,每个前瞻块都将以开头^
,如果其模式是贪婪的,则最多包含$
。甚至古老的VB6 / VBA(Office)5.5 regex引擎也支持超前。
因此,要构建完整的正则表达式,请从先行块开始,然后在final之前添加黑名单字符块$
。
例如,要限制字符总数(例如,包括3到15个字符),请从正向预读块开始(?=^.{3,15}$)
。注意,这需要它自己^
并$
确保覆盖所有文本。
现在,虽然您可能希望允许_和-,但您可能不想以它们开头或结尾,所以请添加两个负的超前代码块((?!^[_-].+)
用于开始和(?!.+[_-]$)
结束)。
如果你不想多_
和-
,加入的负前瞻块(?!.*[_-]{2,})
。这也将排除_-
和-_
顺序。
如果没有更多的前瞻块,则在之前添加黑名单块$
,例如[^<>[\]{\}|\\\/^~%# :;,$%?\0-\cZ]+
,其中\0-\cZ
排除空字符和控制字符,包括NL(\n
)和CR(\r
)。最后+
确保所有文字都被贪婪地包含在内。
在Unicode域中,很可能还需要排除其他代码点或代码块,但是肯定比白名单中必须包含的所有代码块少得多。
以上所有的整个正则表达式将是
(?=^.{3,15}$)(?!^[_-].+)(?!.+[_-]$)(?!.*[_-]{2,})[^<>[\]{}|\\\/^~%# :;,$%?\0-\cZ]+$
Run Code Online (Sandbox Code Playgroud)
您可以在https://regex101.com/上实时检出pcre(php),javascript和python regex引擎。我不知道Java正则表达式适合那些位置,但是您可能需要修改正则表达式以适应其特质。
如果要包括空格而不是_
,只需在正则表达式中的每个位置交换它们。
此技术最有用的应用程序是pattern
HTML input
字段的属性,该属性需要单个表达式,如果失败则返回false,从而使该字段无效,使input:invalid
CSS突出显示该字段,并停止提交表单。
归档时间: |
|
查看次数: |
207130 次 |
最近记录: |