簡體   English   中英

Java嵌套的正則表達式組無法捕獲內部組

[英]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()。

所以確保循環迭代一個步驟,改變<<=例如。

Matcher.group(int)javadoc

這也解釋了為什么在添加額外的捕獲組時它起作用,計數增加,而您卻獲得了兩個最里面的一個,而不是最后一個。 給捕獲組命名是有明顯原因的(沒有錯,只列出它們是錯的)。

暫無
暫無

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

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