[英]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.