[英]Java nested regular expression groups not capturing inner groups
為什么此正則表達式未捕獲最里面的組?
final String regex = "s(tra(nsformer))";
final Pattern pattern = Pattern.compile(regex);
final Matcher match = pattern.matcher("stransformer");
if (match.matches()) {
System.out.println(match.groupCount());
for (int i = 0; i < match.groupCount(); i++) {
System.out.println(match.group(i));
}
}
上面的返回值(在jdk7中)
2
變形金剛
變壓器
奇怪的是, "s(tra((nsformer)))"
模式可以正常工作。 當我將匹配項稱為group("inner")
時, "s(tra(<inner>nsformer))"
也是如此
我們缺少什么?
組計數從1到N。根據Matcher.groupCount()
javadoc:
零組按照慣例表示整個模式。 它不包括在此計數中。
因此代碼應為:
for (int i = 1; i <= match.groupCount(); i++) {
System.out.println(match.group(i));
}
打印:
stransformer
transformer
nsformer
組計數從索引1開始。索引0包含整個模式。 從javadoc的group(int)
:
捕獲組從左到右從一個索引開始。 組零表示整個模式,因此表達式m.group(0)等效於m.group()。
所以確保循環迭代一個步驟,改變<
至<=
例如。
這也解釋了為什么在添加額外的捕獲組時它起作用,計數增加,而您卻獲得了兩個最里面的一個,而不是最后一個。 給捕獲組命名是有明顯原因的(沒有錯,只列出它們是錯的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.