我有一個字符串:如何分割包含多個鍵值對的字符串
Single line : Some text
Multi1: multi (Va1) Multi2 : multi (Va2) Multi3 : multi (Val3)
Dots....20/12/2013 (EOY)
,我試圖找回所有的鍵值對。我第一次嘗試
(單線|多[0-9] {1} |點)([] * :? * | * :? )()
似乎工作但不處理一行上的多個鍵值對。有什麼辦法可以做到這一點?
我有一個字符串:如何分割包含多個鍵值對的字符串
Single line : Some text
Multi1: multi (Va1) Multi2 : multi (Va2) Multi3 : multi (Val3)
Dots....20/12/2013 (EOY)
,我試圖找回所有的鍵值對。我第一次嘗試
(單線|多[0-9] {1} |點)([] * :? * | * :? )()
似乎工作但不處理一行上的多個鍵值對。有什麼辦法可以做到這一點?
我不記得確切的語法,但我認爲這是這樣的:
while (matcher.find()) {
String match = matcher.group();
}
這裏的目標是,你需要遍歷當前行,並告訴它「,而你還在尋找東西,返回給我匹配的這一行上的字符串。「由於您在同一行上有多個匹配項,因此應該繼續爲您提供調查結果。 Matcher的Here is the JavaDoc作爲參考。
這真是令人遺憾的另一個原因,因爲Java真的不適合這種事情,在任何人貶低我的理解之前,我認爲這是對Java API的批評,而不是語言。
您可以使用此模式:
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"));
}
}
試試這個:
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
說明:
Pattern
中的鍵和值。Pattern
分隔,或者用新的 一行,或者用一個開放的圓括號,或者用一個空格後跟一個開放的圓括號。請注意,您不能在向前看或後向組中使用量詞,因此重複。
我知道的語法,但正則表達式將第一個分號後的所有內容作爲line2的值處理,而不是分割它。 – user2600107