0

別の一致に含まれる正規表現一致を取得するにはどうすればよいですか?

同じ文内で、人の名前の後に市区町村が続くものと一致させようとしています。だから私はこれをやっています:

String regex="(Bob|Mary)\\b[^\\.\\?!]*?\\b(Paris|London)\\b.*?[\\.\\?!]";
Pattern pattern=Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher=pattern.matcher("Bob and Mary are planning to go to Paris. They want to leave before July.");

これは、「ボブとメアリーはパリに行く予定です。」と一致し、正しいです。しかし、それは、実際には私が言及した最初の一致の一部である「メアリーはパリに行く予定です.」とは一致しません。「Mary」で始まるこの 2 番目のサブマッチを取得するにはどうすればよいですか?

while (matcher.find()){
        System.out.println(matcher.group());            
    }

結果:

Bob and Mary are planning to go to Paris.

それは正しいです。しかし、次のような出力が期待されます。

Bob and Mary are planning to go to Paris.
Mary are planning to go to Paris.
4

2 に答える 2

3

次のように正規表現を使用することもできます。

String s = "Bob and Mary are planning to go to Paris. They want to leave before July.";
        Pattern p = Pattern.compile("(Bob|Mary).*Paris");
        Matcher m = p.matcher(s);
        int i = 0;
        while(m.find(i)) { // set start index for "find"
            System.out.println(m.group());
            i = m.start() + 1; // update start index to start from beginning of last match + 1
        }
    }

O/P :

Bob and Mary are planning to go to Paris
Mary are planning to go to Paris
于 2016-10-18T06:08:30.653 に答える
1

これはあなたがやろうとしていることですか?

String regex = "(?=((Bob|Mary)\\b[^\\.\\?!]*?\\b(Paris|London)\\b.*?[\\.\\?!]))";
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern
        .matcher("Bob and Mary are planning to go to Paris. They want to leave before July.");
while (matcher.find()){
    System.out.println(matcher.group(1));
}

出力:

Bob and Mary are planning to go to Paris.
Mary are planning to go to Paris.

通常、正規表現は一度一致するものを消費するため、次の一致で文字列の同じ部分を使用することは不可能です。この問題を取り除くために、先読みメカニズム(?=...)グループを使用できます。

于 2013-06-03T12:09:58.027 に答える