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

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

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

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

任何帮助将不胜感激。

我只是白名单上的人物。

^[a-zA-Z0-9äöüÄÖÜ]*$ 

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

 ^[^<>%$]*$ 

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

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

 [<>%\$] 

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

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

根据正则表达式的一些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. } 

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

如果您确实进入黑名单路线,这是一个示例,但要注意,语法并不简单。

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

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

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

我想这取决于您所针对的语言。 一般来说,这样的事情应该有效:

 [^<>%$] 

[] ”构造定义了一个字符类,它将匹配任何列出的字符。 将“ ^ ”作为第一个字符否定匹配,即:除列出的那个之外的任何字符。

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

即使在2009年,似乎有太多人对于所涉及的WORLDWIDE网络设计的想法非常有限。 2015年,除非为特定国家/地区进行设计,否则黑名单是容纳可能有效的大量字符的唯一方式。

然后需要根据需要数据的目的来选择要列入黑名单的字符。

但是,有时需要分解要求,并分别处理每个要求。 在这里,outlook未来是你的朋友。 这些部分由(?=)为正数限制,而(?!)为负数,有效地成为AND块,因为当处理块时,如果没有失败,正则表达式处理器将从文本的开头开始,下一个街区。 实际上,每个前瞻块前面都会有^ ,如果它的模式是贪婪的,则包含最多$ 。 即使是古老的VB6 / VBA(Office)5.5正则表达式引擎也支持前瞻。

因此,要构建完整的正则表达式,请从前瞻块开始,然后在最终$之前添加列入黑名单的字符块。

例如,要限制字符总数(例如3到15之间),请从正向预测块开始(?=^.{3,15}$) 。 请注意,这需要自己的^$来确保它涵盖了所有文本。

现在,虽然您可能想要允许_和 – ,但您可能不希望以它们开始或结束,因此添加两个负向预测块, (?![_-].+)用于启动,以及(?!.+[_-]$)结束。

如果您不想要多个_- ,请添加(?!.*[_-]{2,})的负前瞻块。 这也将排除_--_序列。

如果没有更多的前瞻块,则在$之前添加黑名单块,例如[^<>[\]{\}|\\\/^~%# :;,$%?\0-\cZ]+ ,其中\0-\cZ排除空值和控制字符,包括NL( \n )和CR( \r )。 决赛+确保贪婪地包含所有文本。

在Unicode域中,可能还需要排除其他代码点或块,但肯定比必须包含在白名单中的所有块少得多。

那么以上所有的整个正则表达都将是

 (?=^.{3,15}$)(?![_-].+)(?!.+[_-]$)(?!.*[_-]{2,})[^<>[\]{}|\\\/^~%# :;,$%?\0-\cZ]+$ 

您可以访问https://regex101.com/ ,查看pcre(php),javascript和python正则表达式引擎。 我不知道java正则表达式适用于哪些,但您可能需要修改正则表达式以满足其特性。

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

此技术最有用的应用是HTML input字段的pattern属性,其中需要单个表达式,失败时返回false,从而使字段无效,允许input:invalid css突出显示它,并停止表单提交。

你真的想要将特定字符列入黑名单,还是将允许的字符列入白名单?

我假设你真的想要后者。 这非常简单(将任何其他符号添加到[\-]组中的白名单中):

 ^(?:\p{L}\p{M}*|[\-])*$ 

编辑:使用注释的输入优化模式

为什么你认为正则表达式是最好的工具呢? 如果您的目的是检测字符串中是否存在非法字符,那么测试循环中的每个字符将比构造正则表达式更简单,更有效。

这里是所有法国口音的人物:àÀâääÄáÁéÉèÈêÊëËìÌîÎÏòÒôÔöÖùÙûÛüÜçÇ”ñ

我会谷歌一个德国重音字符列表。 没有那么多。 你应该能够得到它们。

对于URLS我用常规字母替换带重音的URL,如下所示:

 string beforeConversion = "àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇ'ñ"; string afterConversion = "aAaAaAaAeEeEeEeEiIiIiIoOoOoOuUuUuUcC'n"; for (int i = 0; i < beforeConversion.Length; i++) { cleaned = Regex.Replace(cleaned, beforeConversion[i].ToString(), afterConversion[i].ToString()); } 

请注意,这可能是一种更有效的方式。

使用这个

^(?= [a-zA-Z0-9~ @#$ ^ ()_ + = [] {} | \,。?: – ] $)(?!。* [<>‘“/;`% ])

对于ASCII字符,所有不是字母数字和下划线的否定集合:

 /[^\W]/g 

对于电子邮件或用户名validation,我使用了以下表达式,允许4个标准特殊字符 – _。 @

 /^[-.@_a-z0-9]+$/gi 

对于严格的字母数字表达式,请使用:

 /^[a-z0-9]+$/gi 

测试@ RegExr.com

我强烈怀疑能够更容易地得出允许的字符列表与不存在的字符列表 – 一旦你有了这个列表,正则表达式语法变得非常简单。 所以把我当作另一个投票给“白名单”。

你可以直接使用[<>%$] ,因为我们有$ ,否则我们有多个选项

 .*(<|>|%).*