文字列分割でゼロ幅マッチングの正規表現を使用できますか?
質問
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!!]
.
`.
解決 3
Cineからの情報に感謝します 考える これらは私が探している答えです:
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番目のものは、すべての異なる量子を実験することによって正直に発見されました。貪欲でも消極的な仕事でもありませんが、所有物はそうします。
理由はまだわかりません。
他のヒント
ゼロ幅マッチングコンストラクトを確認する必要があります。
(?=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
使用できます \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!!]
所属していません StackOverflow