96

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

我的代码:

//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

19 回答 19

221

请不要那样做……BABY ANGEL像这样的小 Unicode 快要死了!◕◡◕(←这些不是图片)(箭头也不是!)

☺</h1>

而你正在扼杀 20 年的 DOS :-) (最后一个笑脸被称为WHITE SMILING FACE......现在它在263A......但在古代它是ALT-1

和他的朋友

☻</h1>

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

尝试否定匹配:

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

(这仅适用于A-Z“标准”字母和“标准”0-9数字。)

于 2013-08-05T12:23:48.013 回答
38

您在字符类的中间有一个破折号,这意味着一个字符范围。将破折号放在类的末尾,如下所示:

[$&+,:;=?@#|'<>.^*()%!-]
于 2013-08-05T12:22:02.247 回答
27

那是因为您的模式包含 a .-^,它是介于 and 之间的所有字符,包括.and ^,其中包括数字和其他几个字符,如下所示:

在此处输入图像描述

如果使用特殊字符,您的意思是标点符号和符号使用:

[\p{P}\p{S}]

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

于 2013-08-05T12:31:34.717 回答
21

因为您的字符类中没有空格和下划线,我认为遵循正则表达式对您来说会更好:

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

这意味着匹配除[A-Za-z0-9\s_]

统一码版本:

Pattern regex = Pattern.compile("[^\p{L}\d\s_]");
于 2013-08-05T12:27:07.900 回答
12

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

  • 只有文本(或空格):“[A-Za-zÀ-ȕ ]”

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

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

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

所以你可以添加任何范围。

最终,您可以使用一个方便的工具:https ://regexr.com/

祝你好运;)

于 2019-05-14T13:42:14.970 回答
7

使用它来捕捉常见的特殊字符,不包括.-_.

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

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

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

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

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

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

于 2021-03-02T08:13:06.750 回答
7

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

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

(Java代码)

于 2017-03-20T14:52:35.293 回答
5

如果您只依赖 ASCII 字符,则可以依赖使用 ASCII 表中的十六进制范围。这是一个正则表达式,它将获取33-47, 58-64, 91-96,范围内的所有特殊字符123-126

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

但是,您可以将特殊字符视为正常字符。如果我们采用这种方法,您可以简单地执行此操作

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

然而,这不会抓住_ ^,可能还有其他人。

于 2016-02-03T22:06:18.627 回答
5

我已经定义了一种模式来查找范围在 032 到 126 之间的任何 ASCII 特殊字符,除了字母数字。你可以使用类似下面的东西:

要查找任何特殊字符:

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

要找到任何计数的最小值和最大值:

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

这些模式的特殊字符介于 032 到 047、058 到 064、091 到 096 和 123 到 126 之间。

于 2019-06-14T07:58:06.913 回答
4

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

于 2016-07-04T06:41:26.233 回答
4

尝试:

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

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

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

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

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

*: 出现在它之前的一个或多个正则表达式。

于 2016-02-17T11:26:54.303 回答
3

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

String regex = ("[ \\\\s@  [\\\"]\\\\[\\\\]\\\\\\\0-9|^{#%'*/<()>}:`;,!& .?_$+-]+")
于 2018-11-12T10:56:32.423 回答
3

尝试将其用于相同的事情-StringUtils.isAlphanumeric(value)

于 2016-12-07T23:52:56.850 回答
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("");
于 2019-01-21T02:36:10.410 回答
3

我们可以使用 Pattern 和 Matcher 来实现这一点,如下所示:

Pattern pattern = Pattern.compile("[^A-Za-z0-9 ]");
Matcher matcher = pattern.matcher(trString);
boolean hasSpecialChars = matcher.find();
于 2018-09-20T12:18:17.923 回答
2

您可以使用否定匹配:

Pattern regex = Pattern.compile("([a-zA-Z0-9])*"); (对于零个或多个字符)

或者

Pattern regex = Pattern.compile("([a-zA-Z0-9])+"); (对于一个或多个字符)

于 2020-01-08T05:50:35.903 回答
1

要查找任意数量的特殊字符,请使用以下正则表达式模式: ([^(A-Za-z0-9 )]{1,})

[^(A-Za-z0-9 )] 这表示除字母、数字和空格之外的任何字符。{1,0} 这表示前一个块的一个或多个字符。

于 2020-10-05T12:01:24.407 回答
0

(^\W$)

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

于 2016-08-26T09:18:37.723 回答
0

尝试这个。它适用于 C#,它也应该适用于 java。如果要排除空格,只需在其中添加 \s @"[^\p{L}\p{Nd}]+"

于 2020-04-20T15:37:27.397 回答