0

\begin{<word>}入力文字列を <word> が "block"、"vers"、または "refr" で始まるブロックと終わるブロックに分割し、\end{<word>}各ブロックで addBlock() を実行したいと考えています。これらのブロックを 2 つ含む文字列に対してこのメ​​ソッドを試行すると、m.groupCount()正しくは 2 がm.find()返されますが、false が返されます。どうすればいいの?m.group()例外をスローします。

private void addBlocks(String in) {
    Pattern p = Pattern.compile("\\\\begin\\{(vers|refr|block)\\}.*\\\\end\\{(vers|refr|block)\\}");
    Matcher m = p.matcher(in);
    while (m.find()) {
        addBlock(m.group());
    }
}

編集:はい、そこにはいくつかの問題がありました。正規表現は厄介で、あまり直感的ではありません。また、オンラインにはあまり賢明なヘルプがありません。最終的に機能したコードは次のとおりです。

private void addBlocks(String in) {
    Pattern p = Pattern.compile("\\\\begin\{(block|vers|refr)\\}(.|$)*?\\\\end\\{(block|vers|refr)\\}", Pattern.DOTALL);
    Matcher m = p.matcher(in);
    while (m.find()) {
         addBlock(m.group());
    }
}
4

2 に答える 2

0

これは、終了タグが前にあるすべての文字を食べる .* ため、複数の結果を与えることはありません。

groupCount() は、一致した数ではなく、キャプチャ グループの数を返します。ここでも説明: https://stackoverflow.com/a/2989061/2947592

于 2013-11-12T22:04:11.510 に答える