2011-06-24 195 views
0

我有一個通用的正則表達式匹配(在某種程度上)形式的一個典型的字符串問題Java正則表達式最長匹配

... "field1" "field2" "field3" "field4" ... 

我想要做的是,當然,讓每一種字段分開。由於該字段可以包含任何字符,我現在用的形式

... \"(.*?)\" +\"(.*?)\" +\"(.*?)\" +\"(.*?)\" + ... 

的問題是不是產生4個不同的組,一個「包羅萬象」正則表達式,爪哇給我一個,這是合併的4以上,即我得到單場:的

field1" "field2" "field3" "field4 

代替

field1 
field2 
field3 
field4 

我甚至試圖做這樣的事情\ 「([^ \」] *)\」爲每個字段,但結果是一樣的

我怎麼能分別得到這4個領域?

回答

1

matcher.find()每次通話將轉移到下一場比賽:

String input = "... \"field1\" \"field2\" \"field3\" \"field4\" ..."; 
Matcher matcher = Pattern.compile("\"(.*?)\"").matcher(input); 
while (matcher.find()) 
    System.out.println(matcher.group(1)); 

,或者,如果你真的想捕獲所有四位一體的比賽:

Matcher matcher = Pattern.compile("\"(.*?)\".*?\"(.*?)\".*?\"(.*?)\".*?\"(.*?)\".*?").matcher(input); 
if (matcher.find()) { 
    System.out.println(matcher.group(1)); 
    System.out.println(matcher.group(2)); 
    System.out.println(matcher.group(3)); 
    System.out.println(matcher.group(4)); 
} 

都產生相同的輸出,這是:

field1 
field2 
field3 
field4 
1

你在調用matcher.group(1),matcher.group(2)等來獲得單個匹配嗎?默認方法返回整個匹配,即所有字段。

2

您可以嘗試String.split這種輸入的方法。

String input = "... \"field1\" \"field2\" \"field3\" \"field4\" ..."; 
    String[] split = input.split("\"\\s*\"?"); 
    String field1 = split[1]; // field1 
    String field2 = split[2]; // field2 
    String field3 = split[3]; // field3 
    String field4 = split[4]; // field4 
+0

split [x] - 索引從0開始。 – Nrj

+0

@Nrj:索引0可能具有空字符串或「field1」字符串的前綴。嘗試並驗證它。 –