web-dev-qa-db-ja.com

Javaの貪欲でない正規表現

次のコードがあります:

public static void createTokens(){
    String test = "test is a Word word Word word big small";
    Matcher mtch = Pattern.compile("test is a (\\s*.+?\\s*) Word (\\s*.+?\\s*)").matcher(test);
    while (mtch.find()){
        for (int i = 1; i <= mtch.groupCount(); i++){
            System.out.println(mtch.group(i));
        }
    }
}

そして次の出力があります:

Word
w

しかし、私の意見では、それは次のようになります。

Word
word

なぜそうなのか説明してください。

11
Divers

パターンは貪欲ではないため、一致で構成されている間は、テキストの一致をできるだけ少なくします。

?を削除します2番目のグループで、あなたは得るでしょう

単語単語大小

Matcher mtch = Pattern.compile("test is a (\\s*.+?\\s*) Word (\\s*.+\\s*)").matcher(test);
12
theglauber

\\s*を使用すると、0個のスペースを含む任意の数のスペースに一致します。 w(\\s*.+?\\s*)と一致します。スペースで区切られた単語と一致することを確認するには、(\\s+.+?\\s+)を試してください

3
Garrett Hall