正则表达式包括所有特殊字符的模式

128

我想写一个简单的正则表达式来检查给定字符串中是否存在任何特殊字符。我的正则表达式可以工作,但我不知道为什么它还包括所有数字,所以当我输入一些数字时它会返回错误。

我的代码:

//pattern to find if there is any special character in string
Pattern regex = Pattern.compile("[$&+,:;=?@#|'<>.-^*()%!]");
//matcher to find if there is any special character in string
Matcher matcher = regex.matcher(searchQuery.getSearchFor());

if(matcher.find())
{
    errors.rejectValue("searchFor", "wrong_pattern.SearchQuery.searchForSpecialCharacters","Special characters are not allowed!");
}

4
[] 中的短横线应该进行转义,因为在那里它有特殊的意义。 - MightyPork
5
没错。最好定义所有“非特殊”的字符并将其列为否定条件。 - NeplatnyUdaj
也许更明智的做法是断言只使用您想要允许的字符。 - d'alar'cop
你能否提供解决方案 String.replace(""", """)? - Lova Chittumuri
为了轻松地进行正则表达式模式的实时测试,我建议使用这个非常有用的工具:https://regexr.com/ - Grégory C
25个回答

5

如果你只使用ASCII字符,那么你可以使用ASCII表上的十六进制范围。这里是一个正则表达式,它将捕获33-4758-6491-96123-126范围内的所有特殊字符。

[\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]

然而,你可以将特殊字符视为普通字符。如果我们采用这种方法,你可以简单地执行以下操作:

^[A-Za-z0-9\s]+

但这样做无法捕获 _^ 和可能的其他字符。

我最终使用了(?i)^([[a-z][^a-z0-9\\s\\(\\)\\[\\]\\{\\}\\\\^\\$\\|\\?\\*\\+\\.\\<\\>\\-\\=\\!\\_]]*)$来匹配任何字符。 - cdaiga
2
在正则表达式中,永远不要使用[A-z]。它会匹配所有的大写和小写ASCII字母,这是你所期望的。但它也会匹配一些标点符号字符,其代码点位于Za之间。请改用[A-Za-z]或在不区分大小写的模式下使用[a-z] - Alan Moore
@AlanMoore,好的,知道了!我会对答案进行修改。 - Serguei Fedorov
'.'点字符怎么样?它应该匹配除换行符以外的任何字符。在Python中,re.DOTALL匹配所有内容,包括换行符。请查看Python教程中的正则表达式FAQ:https://docs.python.org/2/howto/regex.html。 - Dr Deo

4

尝试:

(?i)^([[a-z][^a-z0-9\\s\\(\\)\\[\\]\\{\\}\\\\^\\$\\|\\?\\*\\+\\.\\<\\>\\-\\=\\!\\_]]*)$

(?i)^(A)$: 表示正则表达式A不区分大小写。

[a-z]: 表示从az的任何字母字符。

[^a-z0-9\\s\\(\\)\\[\\]\\{\\}\\\\^\\$\\|\\?\\*\\+\\.\\<\\>\\-\\=\\!\\_]: 表示除了az、数字和特殊字符(如重音符号)以外的任何字母字符。

[[a-z][^a-z0-9\\s\\(\\)\\[\\]\\{\\}\\\\^\\$\\|\\?\\*\\+\\.\\<\\>\\-\\=\\!\\_]]: 表示任何字母字符(带或不带重音符号)。

*: 前面的正则表达式出现一次或多次。


2
在字符类中,除了 \- 之外,其他字符都不需要转义。其中许多字符根本不需要转义。 “宁愿安全也不要后悔”是一种很好的哲学,但可读性也很重要。 - Alan Moore
@AlanMoore(如果您是漫画书作者,则额外加分),我发现“-”如果作为尾字符保留,则可以不转义。[a-z_=-]匹配a-z、_、=或-。在任何形式的“regex”中,我将可读性放在首位,但是,使用快捷方式最终可能会导致问题。 - alife

3
我们可以使用Pattern和Matcher来实现此目的,具体步骤如下:
Pattern pattern = Pattern.compile("[^A-Za-z0-9 ]");
Matcher matcher = pattern.matcher(trString);
boolean hasSpecialChars = matcher.find();

3
尝试使用以下代码进行相同的操作 - StringUtils.isAlphanumeric(value)

如果您使用此方法,空格/空白也是一个特殊字符。最好在调用此方法之前替换空格和制表符字符。 - Deepu Sahni

3

请使用这个方法,它是最简单的。

\p{Punct} 标点符号:其中之一 !"#$%&'()*+,-./:;<=>?@[]^_`{|}~

https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

    StringBuilder builder = new StringBuilder(checkstring);
    String regex = "\\p{Punct}"; //Special character : `~!@#$%^&*()-_+=\|}{]["';:/?.,><
    //change your all special characters to "" 
    Pattern  pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(builder.toString());
    checkstring=matcher.replaceAll("");

这篇文章列出了被(美国?)登录系统接受的常见特殊字符清单。https://support.okta.com/help/s/article/What-special-characters-are-accepted-by-the-Okta-password?language=en_US - john k
这个答案与(美国?)登录系统常用的特殊字符列表相匹配。 https://support.okta.com/help/s/article/What-special-characters-are-accepted-by-the-Okta-password?language=en_US - undefined

3

这是我用来从任何字符串中删除所有特殊字符的正则表达式:

String regex = ("[ \\\\s@  [\\\"]\\\\[\\\\]\\\\\\\0-9|^{#%'*/<()>}:`;,!& .?_$+-]+")

1
对我来说完美地运作了,但是需要做一个小改变,即为了转义反斜杠“\”,我们应该使用“\\\\” - Naga Srinu Kapusetti

2
你可以使用负匹配: Pattern regex = Pattern.compile("([a-zA-Z0-9])*"); (用于零个或多个字符)
或者 Pattern regex = Pattern.compile("([a-zA-Z0-9])+"); (用于一个或多个字符)

1
问题不仅仅是允许罗马数字和英文字母,如果用户想要输入日文文本,你的解决方案就行不通了。 - mightyWOZ

1
要查找任意数量的特殊字符,请使用以下正则表达式模式:([^(A-Za-z0-9 )]{1,}) [^(A-Za-z0-9 )]表示除字母、数字和空格外的任何字符。 {1,0}表示前一个块的一个或多个字符。

1
它无法找到 () - Wiktor Stribiżew
这里的 () 是有问题的。例如,[^A-Za-z_=] 允许除 A-Z、a-z、_ 或 = 之外的任何字符触发。[^[:alnum:][:punct:]] 同样会在任何非字母数字或标点符号的字符上触发。 - alife

1

尝试这个。它在C#上可以工作,应该也可以在Java上工作。如果你想排除空格,只需添加 \s 在里面 @"[^\p{L}\p{Nd}]+"


0

(^\W$)

^ - 字符串的开头, \W - 匹配任何非单词字符 [^a-zA-Z0-9_], $ - 字符串的结尾


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接