4

コード:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Regex {
public static void main(String[] args) {
    String data = ". Shyam and you. Lakshmi and you. Ram and you. Raju and you. ";
    Pattern pattern = Pattern.compile("\\.\\s(.*?and.*?)\\.\\s");
    Matcher matcher = pattern.matcher(data);
    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }

}
}

期待される出力:

Shyam and you
Lakshmi and you
Ram and you
Raju and you

しかし、私が得た出力は次のとおりです。

Shyam and you
Ram and you

私を修正してください。

4

2 に答える 2

6

".\\s"前のパターンの次のパターンと一致しているため、隣接する一致は得られません。したがって、再び一致することはありません。

ルックアラウンドを使用する必要があります。

Pattern.compile("(?<=\\.\\s)(.*?and.*?)(?=\\.\\s)");

ルックアラウンドは長さ 0 のアサーションです。それらは文字を消費しませんが、前方または後方のパターンがあるかどうかを確認するだけです。


参考文献:

于 2013-08-26T18:21:57.503 に答える
0

私は正規の専門家ではありませんが、各文の間に 1 つしかない場合、パターンは 2 つの . に一致しているようです。

于 2013-08-26T18:22:21.840 に答える