さまざまな区切り文字のセットで区切られた複数行の文字列があります。
(Text1)(DelimiterA)(Text2)(DelimiterC)(Text3)(DelimiterB)(Text4)
を使用してこの文字列を部分に分割することはできますString.split
が、区切り文字の正規表現に一致する実際の文字列を取得できないようです。
つまり、次のようになります:
Text1
Text2
Text3
Text4
これが私が欲しいもの
Text1
DelimiterA
Text2
DelimiterC
Text3
DelimiterB
Text4
区切り文字正規表現を使用して文字列を分割し、区切り文字も保持する JDK の方法はありますか?
ベストアンサー1
正規表現の機能である先読みと後読みを使用できます。
System.out.println(Arrays.toString("a;b;c;d".split("(?<=;)")));
System.out.println(Arrays.toString("a;b;c;d".split("(?=;)")));
System.out.println(Arrays.toString("a;b;c;d".split("((?<=;)|(?=;))")));
そして、次のものが得られます:
[a;, b;, c;, d]
[a, ;b, ;c, ;d]
[a, ;, b, ;, c, ;, d]
最後のはあなたが望むものです。
((?<=;)|(?=;))
;
の前または後の空文字を選択することに等しい;
。
編集:読みやすさに関する Fabian Steeg のコメントは妥当です。正規表現では、読みやすさが常に問題となります。正規表現を読みやすくするために私が行っていることの 1 つは、変数を作成し、その名前で正規表現の動作を表すことです。プレースホルダー (例%1$s
) を配置し、Java を使用してString.format
プレースホルダーを実際に使用する必要のある文字列に置き換えることもできます。例:
static public final String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))";
public void someMethod() {
final String[] aEach = "a;b;c;d".split(String.format(WITH_DELIMITER, ";"));
...
}