文字列を分割しながらも区切り文字を維持するにはどうすればよいでしょうか? 質問する

文字列を分割しながらも区切り文字を維持するにはどうすればよいでしょうか? 質問する

さまざまな区切り文字のセットで区切られた複数行の文字列があります。

(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, ";"));
    ...
}

おすすめ記事