簡體   English   中英

Java正則表達式最長匹配

[英]Java regular expression longest match

我遇到了與以下形式的典型字符串匹配(類似)的通用正則表達式問題

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

我要做的當然是分別獲取每個字段。 因為字段可以包含任何字符,所以我使用的是“ catch-all”正則表達式

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

問題是,Java沒有給我提供四個不同的組,而是給了我一個,它合並了上面的四個,即我得到了一個字段:

field1" "field2" "field3" "field4

代替

field1
field2
field3
field4

我甚至嘗試為每個字段執行\\“([^ \\”] *)\\“之類的操作,但結果是相同的。

如何分別獲得這4個字段?

您可以嘗試將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

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

每次對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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM