2013-07-19 51 views
1

我有一個字符串:如何分割包含多個鍵值對的字符串

Single line : Some text 
Multi1: multi (Va1) Multi2 : multi (Va2) Multi3 : multi (Val3) 
Dots....20/12/2013 (EOY) 

,我試圖找回所有的鍵值對。我第一次嘗試

(單線|多[0-9] {1} |點)([] * :? * | * :? )(

似乎工作但不處理一行上的多個鍵值對。有什麼辦法可以做到這一點?

回答

0

我不記得確切的語法,但我認爲這是這樣的:

while (matcher.find()) { 
    String match = matcher.group(); 
} 

這裏的目標是,你需要遍歷當前行,並告訴它「,而你還在尋找東西,返回給我匹配的這一行上的字符串。「由於您在同一行上有多個匹配項,因此應該繼續爲您提供調查結果。 Matcher的Here is the JavaDoc作爲參考。

這真是令人遺憾的另一個原因,因爲Java真的不適合這種事情,在任何人貶低我的理解之前,我認爲這是對Java API的批評,而不是語言。

+0

我知道的語法,但正則表達式將第一個分號後的所有內容作爲line2的值處理,而不是分割它。 – user2600107

1

您可以使用此模式:

public static void main(String[] args) { 

    String s = "Single line : Some text\n" 
      + "Multi1: multi (Va1) Multi2 : multi (Va2) " 
      + "Multi3 : multi (Val3)\n" 
      + "Dots....20/12/2013 (EOY)"; 

    String wd = "[^\\s.:]+(?:[^\\S\\n]+[^\\s.:]+)*"; 
    Pattern p = Pattern.compile("(?<key>" + wd + ")" 
           + "\\s*(?::|\\.+)\\s*" 
           + "(?<value>" + wd + "(?:\\s*\\([^)]+\\))?)" 
           + "(?!\\s*:)(?=\\s|$)"); 
    Matcher m = p.matcher(s); 

    while (m.find()) { 
     System.out.println(m.group("key")+"->"+m.group("value")); 
    } 
} 
1

試試這個:

String text = "Single line : Some text\r\n" + 
"Multi1: multi (Va1) Multi2 : multi (Va2) Multi3 : multi (Val3)\r\n" + 
"Dots....20/12/2013 (EOY)"; 
Pattern pattern = Pattern.compile("(\\p{Alnum}[\\p{Alnum}\\s/]+?)\\s?(:|\\.+)\\s?(\\p{Alnum}[\\p{Alnum}\\s/]+?)(?=($|\\()|(\\s\\())", Pattern.MULTILINE); 
Matcher matcher = pattern.matcher(text); 
while (matcher.find()) { 
    System.out.println(matcher.group(1) + "-->" + matcher.group(3)); 
} 

輸出:

Single line-->Some text 
Multi1-->multi 
Multi2-->multi 
Multi3-->multi 
Dots-->20/12/2013 

說明:

  • 我限制「以字母數字開頭」的鍵和值, 「包含任意數量的字母數字,空格或斜槓」。
  • 我將分隔符限制爲「可選空間,:,可選空間」或 「可選空間,任意數量的連續點,可選空間」。
  • 我正在使用組1和3來定義 Pattern中的鍵和值。
  • 組2用於提供如上的替代分隔符。
  • 最後,末尾用Pattern分隔,或者用新的 一行,或者用一個開放的圓括號,或者用一個空格後跟一個開放的圓括號。

請注意,您不能在向前看或後向組中使用量詞,因此重複。

相關問題