3
System.out.println(
    Arrays.deepToString(
        "abc<def>ghi".split("(?:<)|(?:>)")
    )
);

[abc, def, ghi]これは、私が分割したかのように印刷し"<|>"ます。印刷したい[abc, <def>, ghi]。ここでやりたいことを達成するために正規表現の魔法を使う方法はありますか?


おそらくもっと簡単な例:

System.out.println(
    Arrays.deepToString(
        "Hello! Oh my!! Good bye!!".split("(?:!+)")
    )
);

これは印刷し[Hello, Oh my, Good bye]ます。印刷したい[Hello!, Oh my!!, Good bye!!]。`。

4

3 に答える 3

3

ゼロ幅マッチング構造を確認する必要があります。

(?=X)   X, via zero-width positive lookahead
(?!X)   X, via zero-width negative lookahead
(?<=X)  X, via zero-width positive lookbehind
(?<!X)  X, via zero-width negative lookbehind
于 2010-03-09T04:37:09.187 に答える
1

幅がゼロであるため、検索対象として(単語境界)を使用\bし、それを検索のアンカーとして使用でき<ます>

String s = "abc<def>ghi";
String[] bits = s.split("(?<=>)\\b|\\b(?=<)");
for (String bit : bits) {
  System.out.println(bit);
}

出力:

abc
<def>
ghi

今ではそれは一般的な解決策ではありません。そのために、おそらくカスタム分割メソッドを作成する必要があります。

2番目の例は、実際split()にはあなたが求めているのではなく、正規表現のマッチングループであることを示しています。例えば:

String s = "Hello! Oh my!! Good bye!!";
Pattern p = Pattern.compile("(.*?!+)\\s*");
Matcher m = p.matcher(s);
while (m.find()) {
  System.out.println("[" + m.group(1) + "]");
}

出力:

[Hello!]
[Oh my!!]
[Good bye!!]
于 2010-03-09T04:23:52.537 に答える
0

シネからの情報のおかげで、私はこれらが私が探している答えだと思います:

System.out.println(
    Arrays.deepToString(
        "abc<def>ghi<x><x>".split("(?=<)|(?<=>)")
    )
); // [abc, <def>, ghi, <x>, <x>]


System.out.println(
    Arrays.deepToString(
        "Hello! Oh my!! Good bye!! IT WORKS!!!".split("(?<=!++)")
    )
); // [Hello!,  Oh my!!,  Good bye!!,  IT WORKS!!!]

さて、2番目のものはすべての異なる数量詞を実験することによって正直に発見されました。貪欲でも消極的な仕事でもありませんが、所有格はそうです。

理由はまだわかりません。

于 2010-03-09T05:25:25.233 に答える