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

Pio*_*ara 49 java regex

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

我的代码:

//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就像这个人正在死!◕◡◕(←这些不是图像)(也不是箭头!)

☺

而你正在杀死20年的DOS :-)(最后的笑脸被称为白色的笑脸......现在它在263A ......但在古代它是ALT-1)

和他的朋友

☻

黑色的笑脸......现在它在263B ......但在古代它是ALT-2

尝试否定匹配:

Pattern regex = Pattern.compile("[^A-Za-z0-9]");
Run Code Online (Sandbox Code Playgroud)

(这将只有AZ"标准"字母和"标准"数字.

  • 还有比英语更多的语言... (5认同)
  • 这适用于非英语角色吗?比如Ã蔿 (3认同)
  • @AbrahamMurcianoBenzadon:十进制数字,大写罗马字母和小写罗马字母占据三个_disjoint_范围的字符代码空间. (3认同)
  • @AbdullahShoaib显然不是:)你需要完整列出你认为"特殊"和/或你认为"好"的东西. (2认同)
  • 假设我们使用 [A-Za-z0-9] ,但是如果我们需要处理西里尔字母或更多字母,那么如何执行正则表达式呢? (2认同)

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)

第一组

[!-\/]

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

-- 32 个字符中的 15 个匹配

第二组

[:-@]

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

-- 32 个字符中的 7 个匹配

第三组

[[-`]

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

-- 32 个字符中的 6 个匹配

第四组

[{-~]

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

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

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

参考

特殊字符表_排列

扩展 ASCII 表


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 和最大值:

(?=.*[ -\/:-@\[-\`{-~]{1,})
Run Code Online (Sandbox Code Playgroud)

这些模式的特殊字符范围为 032 至 047、058 至 064、091 至 096 以及 123 至 126。


Chu*_*uck 7

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

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

(Java代码)


sam*_*sam 6

使用此正则表达式模式(“^[a-zA-Z0-9]*$”)。它验证不包括特殊字符的字母数字字符串


Ser*_*rov 5

如果您仅依赖 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)

然而,这不会捕捉到_ ^,也可能捕捉到其他人。

  • **切勿在正则表达式中使用 `[Az]`。** 它会按照您的预期匹配所有大写和小写 ASCII 字母。但它也匹配代码点位于“Z”和“a”之间的几个标点字符。使用“[A-Za-z]”代替,或在不区分大小写模式下使用“[az]”。 (2认同)

小智 5

使用它来捕获不包括.-_.

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

如果你也想包括.-_,那么使用这个:

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

如果要过滤 URL 友好且不包含任何特殊字符或空格的字符串,请使用以下命令:

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

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