2011-07-30 48 views
0

好的,你可能會說這是一個重複的帖子,但它是不同的。Java - 使用多個分隔符的字符串解析或split()錯誤

我正在處理某種程序,該程序正在處理用戶指定的某種刪除分隔符。如果分隔符只是一個單獨的字符(特殊與否),我的程序正在工作。但是,如果用戶輸入是字符串,則會從消息字符串中刪除分隔符的所有字符。

前。 String message =「ab \ nc [d] e {fMardk1g(h)i} j」;輸出將是:bcefghij 但預期的輸出是abcdefghij

我是使用Pattern類的新手,所以我不知道問題出在哪裏。

這裏的問題(我把它放在一個測試類,所以我可以找出問題)代碼:

進口的java.util.regex.Pattern;

public class ParsingTest { 
    public static void main(String[] args) { 
     String[] delimiters = { "Mardk1", "\n", "[", "]", "{", "}", "(", ")" }; 
     StringBuilder regexp = new StringBuilder(""); 
     regexp.append("["); 
     for(String s : delimiters) { 
      regexp.append("["); 
      regexp.append(Pattern.quote(s)); 
      regexp.append("]"); 
     } 
     regexp.append("]"); 

     String message = "ab\nc[d]e{fMardk1g(h)i}j"; 
     StringBuilder result = new StringBuilder(""); 
     String[] a = message.split(regexp.toString()); 
     for(String string : a) { 
      result.append(string); 
     } 
     System.out.println(result); 
     for(String str: a) System.out.print(str); 
     System.out.println(); 
    } 
} 
+0

你產生正則表達式將包含'[Mardk1]'將由字符中的任一項限定'M,A,R,d,k或1 ',這就是爲什麼你在輸出中看不到'a'字符的原因。 – rodion

回答

1

您正在使用錯誤的分組構造。您正在構建像[xyz]這樣的模式,它將匹配任何單個字符x,y或z。你想匹配幾個完整的字符串中的任何一個,所以你需要正常的()風格分組,以及交替操作符(|)。有關更多詳細信息,請參閱Pattern文檔。

嘗試此代替建立該正則表達式:

for(String s : delimiters) { 
    // We don't want to start with (| 
    if (regexp.length() > 1) 
    { 
     regexp.append("|"); 
    } 
    regexp.append(Pattern.quote(s)); 
} 
+0

哦,TNX ...你已經解決了我的問題。爲什麼有必要有「|」在 – JinShin

+0

這兩個字之間@JinShin:這是交替運算符,表示它匹配這個或那個或(etc)。因此「(ab | cd | ef)」將匹配「ab」,「cd」或「ef」。 –

+0

哦,tnx再次。我現在明白了。 – JinShin

相關問題