2013-01-16 214 views
7

可能重複:
Replacing all non-alphanumeric characters with empty strings刪除所有特殊字符在Java

import java.util.Scanner; 
import java.util.regex.*; 
public class io{ 
public static void main(String args[]){ 
Scanner scan = new Scanner(System.in); 
String c; 
if((c=scan.nextLine())!=null) 
{ 
Pattern pt = Pattern.compile("[^a-zA-Z0-9]"); 
Matcher match= pt.matcher(c); 
    while(match.find()){ 
     c=c.replace(Character.toString(c.charAt(match.start())),""); 
     } 
    System.out.println(c); 
     } 
    } 
} 

案例1

Input : hjdg$h&jk8^i0ssh6 
Expect : hjdghjk8i0ssh6 
Output : hjdgh&jk8^issh6 

案例2

Input : hjdgh&jk8i0ssh6 
Expect : hjdghjk8i0ssh6 
Output : hjdghjk8i0ssh6 

案例3

Input : hjdgh&j&k8i0ssh6 
Expect : hjdghjk8i0ssh6 
Output : hjdghjki0ssh6 

請人幫我弄清楚,什麼是錯在我的代碼邏輯?

+2

考慮看的Java命名約定,並在提交問題之前格式化你的源代碼。 – rtheunissen

+0

嘗試'[^ az $] | [^ AZ $] | [^ 0-9 $]' – noMAD

+0

@ paranoid-android其實,我在記事本上寫了上面的代碼.. :( – Ravi

回答

15

使用[\\W+]"[^a-zA-Z0-9]"作爲正則表達式匹配任何特殊字符,還可以使用String.replaceAll(正則表達式,字符串)與空字符串替換SPL性格特徵。請記住,作爲String.replaceAll的第一個參數是一個正則表達式,你必須用反斜槓將它轉義爲文字字符。

  String c= "hjdg$h&jk8^i0ssh6"; 
     Pattern pt = Pattern.compile("[^a-zA-Z0-9]"); 
     Matcher match= pt.matcher(c); 
     while(match.find()) 
     { 
      String s= match.group(); 
     c=c.replaceAll("\\"+s, ""); 
     } 
     System.out.println(c); 
+0

'c = c.replace(match.group(),「」);'這個也可以。爲什麼? – Ravi

+0

@var___請注意,我使用replaceAll這需要第一個參數作爲正則表達式,而您使用替換whihc不採取正則表達式,因此它的工作.. :) – PermGenError

+0

好..我現在得到它..謝謝! – Ravi

9

您可以閱讀這些行並以這種方式安全地替換所有特殊字符。
請記住,如果您使用\\W,則不會替換下劃線。

Scanner scan = new Scanner(System.in); 

while(scan.hasNextLine()){ 
    System.out.println(scan.nextLine().replaceAll("[^a-zA-Z0-9]", ""); 
} 
+0

如果我想使用'regex'包,那該怎麼辦 – Ravi

+0

那麼如果這是一個任務,而且你必須使用'regex'包,那麼你可能會看到一個不必要的複雜解決方案。想使用'regex'包嗎? – rtheunissen

+0

所以,我可以瞭解更多關於'reg ex'包 – Ravi

2

你的問題是,match.start()返回的索引對應,因爲它出現在原始字符串,當你與之匹配的字符的位置;但是,每當您重寫字符串c時,這些索引變得不正確。

解決這一點,最好的方法是使用replaceAll,例如:

 System.out.println(c.replaceAll("[^a-zA-Z0-9]", ""));