我想写一个简单的正则表达式来检查给定的字符串是否存在任何特殊字符.我的正则表达式有效,但我不知道为什么它也包含所有数字,所以当我输入一些数字时它会返回错误.
我的代码:
//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!");
}
Run Code Online (Sandbox Code Playgroud)
xan*_*tos 135
请不要这样做...小Unicode BABY ANGEL就像这个人正在死!◕◡◕(←这些不是图像)(也不是箭头!)
和他的朋友
尝试否定匹配:
Pattern regex = Pattern.compile("[^A-Za-z0-9]");
Run Code Online (Sandbox Code Playgroud)
(这将只有AZ"标准"字母和"标准"数字.
Jer*_*rry 22
你在字符类的中间有一个短划线,这意味着一个字符范围.将破折号放在类的末尾,如下所示:
[$&+,:;=?@#|'<>.^*()%!-]
Run Code Online (Sandbox Code Playgroud)
Sin*_*ian 19
这是因为你的模式都包含.-^这是与包括之间的所有字符.和^,其中包括数字和其他几个字符,如下图所示:

如果使用特殊字符,则表示标点符号和符号使用:
[\p{P}\p{S}]
Run Code Online (Sandbox Code Playgroud)
其中包含所有unicode标点和符号.
小智 14
赞扬Mohamed Yusuff的解决方案!
我们可以使用 range 来匹配所有 32 个特殊字符。
[!-\/:-@[-`{-~]
Run Code Online (Sandbox Code Playgroud)
-- 32 个字符中的 15 个匹配
-- 32 个字符中的 7 个匹配
-- 32 个字符中的 6 个匹配
-- 32 个字符中有 4 个匹配
总共匹配回所有 32 个字符 (15+7+6+4)
anu*_*ava 13
你在角色类中没有空格和下划线我认为跟随正则表达式对你更好:
Pattern regex = Pattern.compile("[^\w\s]");
Run Code Online (Sandbox Code Playgroud)
这意味着匹配除了之外的一切 [A-Za-z0-9\s_]
Unicode版本:
Pattern regex = Pattern.compile("[^\p{L}\d\s_]");
Run Code Online (Sandbox Code Playgroud)
小智 10
对于寻找特殊字符(如 Ä 等)答案的人(如我),只需使用以下模式:
只有文本(或空格):“[A-Za-zÀ-?]”
文字和数字:“[A-Za-zÀ-?0-9]”
文本、数字和一些特殊字符:“[A-Za-zÀ-?0-9(),-_., ]”
正则表达式只是从 ascii 索引开始,并检查字符串的字符是否在两个索引 [startindex-endindex] 中。
所以你可以添加任何范围。
最终你可以使用一个方便的工具:https : //regexr.com/
祝你好运;)
小智 10
我定义了一种模式来查找 032 到 126 之间的任何 ASCII 特殊字符(字母数字除外)。您可以使用如下所示的内容:
要查找任何特殊字符:
Run Code Online (Sandbox Code Playgroud)[ -\/:-@\[-\`{-~]要查找任意计数中的最小值 1 和最大值:
Run Code Online (Sandbox Code Playgroud)(?=.*[ -\/:-@\[-\`{-~]{1,})
这些模式的特殊字符范围为 032 至 047、058 至 064、091 至 096 以及 123 至 126。
这是我的特殊字符的正则表达式变体:
String regExp = "^[^<>{}\"/|;:.,~!?@#$%^=&*\\]\\\\()\\[¿§«»??¤°??€¥£¢¡®©0-9_+]*$";
Run Code Online (Sandbox Code Playgroud)
(Java代码)
如果您仅依赖 ASCII 字符,则可以依赖使用 ASCII 表上的十六进制范围。33-47这是一个正则表达式,它将抓取, 58-64, 91-96,范围内的所有特殊字符123-126
[\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]
Run Code Online (Sandbox Code Playgroud)
但是,您可以将特殊字符视为非普通字符。如果我们采用这种方法,您可以简单地执行此操作
^[A-Za-z0-9\s]+
Run Code Online (Sandbox Code Playgroud)
然而,这不会捕捉到_ ^,也可能捕捉到其他人。
小智 5
使用它来捕获不包括.-_.
/[!"`'#%&,:;<>=@{}~\$\(\)\*\+\/\\\?\[\]\^\|]+/
Run Code Online (Sandbox Code Playgroud)
如果你也想包括.-_,那么使用这个:
/[-._!"`'#%&,:;<>=@{}~\$\(\)\*\+\/\\\?\[\]\^\|]+/
Run Code Online (Sandbox Code Playgroud)
如果要过滤 URL 友好且不包含任何特殊字符或空格的字符串,请使用以下命令:
/^[^ !"`'#%&,:;<>=@{}~\$\(\)\*\+\/\\\?\[\]\^\|]+$/
Run Code Online (Sandbox Code Playgroud)
当您使用诸如 之类的模式时/[^A-Za-z0-9]/,您将开始捕捉像其他语言的特殊字母和一些欧洲重音字母(如 é, í )。