用于排除特殊字符的正则表达式

31 java regex

我无法想出一个正则表达式,它基本上会将某些特殊字符列入黑名单.

我需要使用它来验证输入字段中的数据(在Java Web应用程序中).我们希望允许用户输入任何数字,字母(我们需要包括重音字符,例如法语或德语)和一些特殊字符,例如' - .等等

如何将<>%$等字符列入黑名单?

任何帮助将不胜感激.

Dan*_*ner 40

我只是白名单上的人物.

^[a-zA-Z0-9äöüÄÖÜ]*$
Run Code Online (Sandbox Code Playgroud)

使用正则表达式构建黑名单同样简单,但您可能需要添加更多字符 - 在unicode中有很多中文符号...;)

^[^<>%$]*$
Run Code Online (Sandbox Code Playgroud)

表达式[^(这里有很多字符)]只匹配未列出的任何字符.

  • 你没有得到我想要的观点.这不是您选择的角色作为样本,而是关于不能真正将所有可能的组合列入白名单. (3认同)
  • 您的白名单模式仅包含德语变音符号,但没有法语或其他字符 - 并且有许多常见字符...例如:ñëÿêâôîíì等因此,基本上只使用Unicode字符组使得白名单可以满足给定的要求. (2认同)
  • @Atomiton,越南语(例如)有11个元音核,每个元音可以有5个重音符号之一(例如:ệ)以及字母đ.波兰人有ŁŹĘĘ...土耳其人点缀着我,İ.有数百种不同的重音字母. (2认同)
  • 他想要包括几百个,但他想要排除几千个. (2认同)

Dav*_*son 8

要排除某些字符(<,>,%和$),您可以制作如下的正则表达式:

[<>%\$]
Run Code Online (Sandbox Code Playgroud)

此正则表达式将匹配其中包含黑名单字符的所有输入.括号定义了一个字符类,并且在美元符号之前是必需的,因为美元符号在正则表达式中具有特殊含义.

要在黑名单中添加更多字符,只需将它们插入括号之间即可; 订单没关系.

根据正则表达式的一些Java文档,您可以使用如下表达式:

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)


mcg*_*raw 6

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


Jas*_*yne 5

通常最好将您允许的字符列入白名单,而不是将您不允许的字符列入黑名单.从安全角度和易于实施的角度来看都是如此.

如果你确实沿着黑名单路线走下去,这是一个例子,但要注意,语法并不简单.

http://groups.google.com/group/regex/browse_thread/thread/0795c1b958561a07

如果你想将所有重音字符列入白名单,也许使用unicode范围会有帮助吗?看看这个链接.

http://www.regular-expressions.info/unicode.html


Kar*_*enF 5

我想这取决于您所针对的语言。通常,这样的事情应该起作用:

[^<>%$]
Run Code Online (Sandbox Code Playgroud)

[]”结构定义了一个字符类,它将与列出的任何字符匹配。将“ ^”作为第一个字符将否定匹配,即:除所列字符中的一个以外的任何其他字符。

[]根据您使用的语言/正则表达式引擎,您可能需要转义“ ”中的某些字符。


Pat*_*ali 5

即使在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正则表达式适合那些位置,但是您可能需要修改正则表达式以适应其特质。

如果要包括空格而不是_,只需在正则表达式中的每个位置交换它们。

此技术最有用的应用程序是patternHTML input字段的属性,该属性需要单个表达式,如果失败则返回false,从而使该字段无效,使input:invalidCSS突出显示该字段,并停止提交表单。