4

次のコードを見てください。

public static void main(String[] args) {
    String s = "a < b > c > d";
    String regex = "(\\w\\s*[<>]\\s*\\w)";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(s);
    int i = 0;
    while (m.find()) System.out.println(m.group(i++));
}

上記のプログラムの出力は次のとおりです。a < b, c > d

しかし、私は実際に期待していa < b, b > c, c > dます。

ここで私の正規表現に何か問題がありますか?

4

3 に答える 3

3

b> cは正規表現と一致するので、一致すると考えるのは正しいです。

ただし、Matcher :: find()を呼び出すと、正規表現に一致し、前のfind()の一致と素である入力の次のサブストリングが返されます。「b>c」は、前の呼び出しで返された「a> b」一致の一部である「b」で始まるため、find()では返されません。

于 2011-04-01T04:05:51.307 に答える
2

これを試して。

    String s = "a < b > c > d";
    String regex = "(?=(\\w{1}\\s{1}[<>]{1}\\s{1}\\w{1})).";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(s);
    while(m.find()) {
        System.out.println(m.group(1));
    }

更新(グリーンのソリューションに基づく)

    String s = " something.js > /some/path/to/x19-v1.0.js < y < z < a > b > c > d";
    String regex = "(?=[\\s,;]+|(?<![\\w\\/\\-\\.])([\\w\\/\\-\\.]+\\s*[<>]\\s*[\\w\\/\\-\\.]+))";

    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(s);
    while (m.find()) {
        String d = m.group(1);
        if(d != null) {
            System.out.println(d);
        }
    }
于 2011-04-01T05:20:41.923 に答える
1

Johnのソリューションに基づいて、いくつかの境界マッチャーを追加すると、これは最終的に機能します。

    String s = " something.js > /some/path/to/x19-v1.0.js < y < z < a > b > c > d";
    String regex = "(?=[\\s,;]+([\\w\\/\\-\\.]+\\s*[<>]\\s*[\\w\\/\\-\\.]+)[\\s,;$]*).";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(s);
    while(m.find()) {
        System.out.println(m.group(1));
    }
于 2011-04-04T01:25:09.460 に答える