2014-02-28 28 views
0

我有一個帶有字符串的大數組。我需要使用數組中的字符串來形成模式。但是,對於文本中的字符串可能跨越多行。構造的模式不適用於多行標誌。任何人都可以指出什麼是錯的?謝謝。Java正則表達式 - 多行

這裏是我的代碼:

String[] phrases = new String[2]; 
    phrases[0] = "student (male)"; 
    phrases[1] = "worker (female)"; 

    Pattern[] ptn = new Pattern[phrases.length]; 

    int i = 0; 
    for (String p : phrases) 
    { 
     p = Pattern.quote(p); 
     System.out.println(p); 
     ptn[i] = Pattern.compile(p+"\\:\\s\\w+",Pattern.MULTILINE); 
     i++; 
    } 

    String text = "student\n(male): John"; 
    System.out.println(text); 

    for(Pattern p : ptn) 
    { 
     Matcher m = p.matcher(text); 
     while(m.find()) 
     { 
      System.out.println(m.group()); 
     } 
    } 
+0

你有幾個問題,其中最重要的是你的模式永遠無法匹配給定的樣本輸入/輸出;你可以重寫這些字符串嗎? – fge

+0

從文件中讀取輸入字符串數組。文本也從文件中讀取。所以對字符串的所有修改都必須在程序中完成。 – user3321400

回答

2

在這裏,你不需要那麼MULTILINE標誌:

由於@fge如前所述,該標誌僅僅意味着^(和$)將匹配開始(和結束)的每個行在被測試的字符串。
提醒:默認行爲(沒有該標誌)將導致^$分別匹配整個String的開始和結束


如果你想匹配,在某些時候,無論是空間新線,我建議你去嘗試匹配\s

但是,如果替換以下行:

phrases[0] = "student (male)"; 
phrases[1] = "worker (female)"; 

由:

phrases[0] = "student\\s(male)"; 
phrases[1] = "worker\\s(female)"; 

那麼你將無法使用Pattern#quote逃生括號。我認爲,最簡單的方法就是直接自己逃避這些如下:

phrases[0] = "student\\s\\(male\\)"; 
phrases[1] = "worker\\s\\(female\\)"; 

如果你確實不能修改這些字符串,你可能只是改變:

p = Pattern.quote(p); 

爲:

p = p.replaceAll("(\\(|\\))", "\\\\"+"$1").replaceAll(" ", "\\\\s"); 

這將:

  • 逃脫()
  • \s更換空間()來匹配任一空格或新行。

這裏是一個Ideone link到你的代碼如何能成爲:)

希望它可以幫助一些可執行的例子!

+0

+1也注意到需要'Pattern.quote()'!順便說一下,你可以編輯你的文章,並重新添加關於'Pattern.MULTILINE'和'Pattern.DOTALL'的解釋;) – fge

+0

糟糕,你是對的,我應該這樣做!謝謝:) – ccjmne

+0

問題是我無法手動修改每個數組,因爲數據太多。創建的模式不能使用替換:p = p.replaceAll(「\\(」,「\\(」); 和p = p.replaceAll(「\\)」,「\\)」);因此,我似乎必須使用Pattern#quote,我剛從另一篇文章中向您學習。 – user3321400