2013-08-05 163 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

相關問題