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

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个回答

266

请不要这样做... 像这个小的Unicode BABY ANGEL 一样的符号正在消失!◕◡◕(← 这些不是图片)(箭头也不是!)

你正在消灭20年的DOS :-) (最后一个表情称为WHITE SMILING FACE...现在它在263A...但在古代它是ALT-1

以及他的朋友

BLACK SMILING FACE... 现在它在263B...但在古代它是ALT-2

尝试负匹配:

Pattern regex = Pattern.compile("[^A-Za-z0-9]");

(仅接受 A-Z 的“标准”字母和“标准”0-9数字。)


2
@AbdullahShoaib 显然不是 :) 你需要列出所有你认为“特别”的和/或你认为“好”的内容的完整列表。 - xanatos
5
十进制数字、大写罗马字母和小写罗马字母占据字符编码空间的三个不相交区间。 - Solomon Slow
1
@AbrahamMurcianoBenzadon 您可以在Sina的另一个回复中发布的字符映射的方便截图中看到James编写的内容:除0-9、a-z、A-Z之外,您的正则表达式将接受*:;<=>?@[]^_`* - xanatos
2
假设我们使用[A-Za-z0-9],但如果我们需要考虑Cyrillic或其他一些字母表,那么如何编写正则表达式? - Kaloyan Stamatov
4
除了英语,还有更多的编程语言... - PeiSong
显示剩余3条评论

50

你的字符类中间有一个破折号,这意味着一个字符范围。将破折号放在类的末尾,像这样:

[$&+,:;=?@#|'<>.^*()%!-]

你能否提供以下代码的解决方案:String.replace(""", """); - Lova Chittumuri
@LovaChittumuri 请清晰地陈述您的问题。您想要实现什么,输入是什么,期望的输出是什么。 - Jerry

33
那是因为你的模式包含一个.-^,它代表在.^之间的所有字符,包括数字和其他一些字符,如下所示:

enter image description here

如果你说的特殊字符指标点符号和符号,请使用:
[\p{P}\p{S}]

其中包含所有Unicode标点符号和符号。


30

因为你在字符类中没有包含空格和下划线,所以我认为以下正则表达式会更适合你:

Pattern regex = Pattern.compile("[^\w\s]");

这意味着匹配除了[A-Za-z0-9\s_]以外的所有内容。

Unicode版本:

Pattern regex = Pattern.compile("[^\p{L}\d\s_]");

17

对于像我这样寻找特殊字符(如Ä等)答案的人,只需使用以下模式:

  • 仅文本(或空格):"[A-Za-zÀ-ȕ ]"

  • 文本和数字:"[A-Za-zÀ-ȕ0-9 ]"

  • 文本、数字和一些特殊字符:"[A-Za-zÀ-ȕ0-9(),-_., ]"

正则表达式从ASCII索引开始,检查字符串中的字符是否在两个索引[startindex-endindex]之间。

因此,您可以添加任何范围。

最后,您可以使用方便的工具进行尝试:https://regexr.com/

祝你好运;)


正是我需要的东西。感谢您的解释。 - azurecorn

14

使用此代码可捕获常见的特殊字符,但不包括.-_

/[!"`'#%&,:;<>=@{}~\$\(\)\*\+\/\\\?\[\]\^\|]+/

如果你想要包含 .-_,那么请使用这个:

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

如果您想要过滤掉既不包含特殊字符也不包含空格的URL友好字符串,请使用以下内容:

/^[^ !"`'#%&,:;<>=@{}~\$\(\)\*\+\/\\\?\[\]\^\|]+$/

当你使用像/[^A-Za-z0-9]/这样的模式时,你会开始捕获一些其他语言和一些欧洲重音字母(如é,í)之类的特殊字母。


12

Mohamed Yusuff的解决方案致敬!

我们可以使用范围匹配所有32个特殊字符。

[!-\/:-@[-`{-~]

第一组

[!-\/]

  • 匹配ASCII码从33到47:
  • !"#$%&'()*+,-./

-- 15个字符中有32个字符匹配成功

第二组

[:-@]

  • 匹配ASCII码从58到64:
  • :;<=>?@

-- 7个字符中有32个字符匹配成功

第三组

[[-`]

  • 匹配ASCII码从91到96:
  • [\]^_`

-- 6个字符中有32个字符匹配成功

第四组

[{-~]

  • 匹配ASCII码从123到126:
  • {|}~

-- 4个字符中有32个字符匹配成功

总共匹配回所有32个字符(15+7+6+4)

参考资料

特殊字符表格_排列

扩展ASCII表格


10

我定义了一个模式去查找位于032到126之间的任何ASCII特殊字符,但不包括字母数字字符。您可以使用类似以下的代码:

To find any Special Character:

[ -\/:-@\[-\`{-~]

To find minimum of 1 and maximum of any count:

(?=.*[ -\/:-@\[-\`{-~]{1,})

这些模式包含特殊字符,范围从032到047、058到064、091到096和123到126。


8

这是一个特殊字符的正则表达式变体:

String regExp = "^[^<>{}\"/|;:.,~!?@#$%^=&*\\]\\\\()\\[¿§«»ω⊙¤°℃℉€¥£¢¡®©0-9_+]*$";

(Java代码)


6
使用这个正则表达式模式 ("^[a-zA-Z0-9]*$")。它验证包含字母数字的字符串,但不包括特殊字符。

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