2013-08-05 128 views
27

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

我的代码:

//pattern to find if there is any special character in string 
    Pattern regex = Pattern.compile("[$&+,:;[email protected]#|'<>.-^*()%!]"); 
    //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!"); 
    } 
+3

在'[]破折号'应该逃脱,它具有特殊的意义存在。 – MightyPork

+6

**所以你认为现存的唯一特殊字符是键盘上的字符**!** :-) – xanatos

+2

没错。最好定义所有“非特殊”字符并作出否定。 – NeplatnyUdaj

回答

84

请不要那样做......小的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“标准”字母和“标准”数字。

+3

这是否适用于非英文字符?如Ã –

+2

@AbdullahShoaib显然不是:)你需要做一个你认为“特殊”和/或你认为“好”的完整清单。 – xanatos

+0

我注意到很多人用'[A-Za-z0-9]'来表示任何字母或数字,都是小写字母和大写字母,但是做'[0-z]'不是更好吗? –

13

你必须在字符类,这将意味着一个字符范围中间的冲刺。把破折号在课程结束后,像这样:

[$&+,:;[email protected]#|'<>.^*()%!-] 
6

,因为你没有空白和你的性格类强调我认为以下的正则表达式将更好的为您:

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

这意味着匹配其他的一切比[A-Za-z0-9\s_]

Unicode版本:

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

那是因为你的模式包含.-^这之间并包括所有字符和^,其中包括数字和其他几个字符,如下图所示:

enter image description here

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

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

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

3
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class detectspecial{ 
public int getSpecialCharacterCount(String s) { 
    if (s == null || s.trim().isEmpty()) { 
     System.out.println("Incorrect format of string"); 
     return 0; 
    } 
    Pattern p = Pattern.compile("[^A-Za-z0-9]"); 
    Matcher m = p.matcher(s); 
    // boolean b = m.matches(); 
    boolean b = m.find(); 
    if (b == true) 
     System.out.println("There is a special character in my string "); 
    else 
     System.out.println("There is no special char."); 
    return 0; 
} 
} 
+0

返回0 –

2

如果您只依赖ASCII字符,则可以依靠在ASCII表格上使用十六进制范围。这是一个正则表达式,将抢在33-4758-6491-96范围内的所有的特殊字符,123-126

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

但是你能想到的特殊字符普通字符。如果我们采取这种方法,你可以简单地做到这一点

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

豪尔这不会赶上_^和可能其他人。

+0

我终于使用了'(?i)^([[az] [^ a-z0-9 \\ s \\(\\)\\ [\\] \\ {\\} \\\\^\\ $ \\ | \\?\\ * \\ + \\。\\ <\\> \\ - \\ = \\!\\ _]] *)$'匹配任何字符。 – cdaiga

+0

无论什么最适合你! –

+1

**绝对不要在正则表达式中使用'[A-z] **“,它可以像所期望的那样匹配所有大写和小写ASCII字母。但它也匹配代码点位于'Z'和'a'之间的几个标点符号。在不区分大小写的模式下,使用'[A-Za-z]'或者'[a-z]'。 –

2

尝试:

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

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

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

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

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

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

+0

这将是一个更好的答案,如果它包含解释和代码。 –

+0

@JohnHascall,我刚刚添加了一个解释。 – cdaiga

+0

在一个字符类中,除了'\'和'-'以外,这些字符都不需要转义。他们中的许多人根本不需要逃脱。 “比对不起更安全”是一种很好的理念,但可读性也很重要。您错过了 –

1

使用该正则表达式模式( “^ [A-ZA-Z0-9] * $”)。它验证不包括特殊字符

0

(^ \ W $)的字母数字字符串

^- 开始的字符串, \ W - 匹配任何非单词字符[^ A-ZA-Z0-9_], $ - 字符串的结束

0

尝试使用本作同样的事情 - StringUtils.isAlphanumeric(value)

1

这是我特殊的cha的正则表达式变体racter:

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

(Java代码)

+1

•☺○♣♥☻☺以及更多.. – Aks4125

相关问题