web-dev-qa-db-ja.com

Regex.Splitの区切り文字を保持する方法は?

SplitクラスのRegex関数を使用して文字列を分割したいと思います。問題は、区切り文字が削除されることであり、区切り文字を保持したいのです。好ましくは、スプリティーの個別の要素として。

私が見つけた 他の議論 によると、それを達成するための不便な方法しかありません。

助言がありますか?

28
user1675891

パターンをキャプチャグループに入れるだけで、一致も結果に含まれます。

_string[] result = Regex.Split("123.456.789", @"(\.)");
_

結果:

_{ "123", ".", "456", ".", "789" }
_

これは他の多くの言語でも機能します:

  • JavaScript"123.456.789".split(/(\.)/g)
  • Pythonre.split(r"(\.)", "123.456.789")
  • Perlsplit(/(\.)/g, "123.456.789")

(Javaではありません)

64
Markus Jarderot

Matchesを使用して文字列内のセパレータを検索し、値とセパレータを取得します。

例:

string input = "asdf,asdf;asdf.asdf,asdf,asdf";

var values = new List<string>();
int pos = 0;
foreach (Match m in Regex.Matches(input, "[,.;]")) {
  values.Add(input.Substring(pos, m.Index - pos));
  values.Add(m.Value);
  pos = m.Index + m.Length;
}
values.Add(input.Substring(pos));
6
Guffa

入力が「abc1defg2hi3jkl」であり、正規表現が数字を取り出すことだとします。

String input = "abc1defg2hi3jkl";
var parts = Regex.Matches(input, @"\d+|\D+")
            .Cast<Match>()
            .Select(m => m.Value)
            .ToList();

パーツは次のようになります:abc1defg2hi3jkl

3
I4V

それらを再度追加します。

    string[] Parts = "A,B,C,D,E".Split(',');
    string[] Parts2 = new string[Parts.Length * 2 - 1];
    for (int i = 0; i < Parts.Length; i++)
    {
        Parts2[i * 2] = Parts[i];
        if (i < Parts.Length - 1)
            Parts2[i * 2 + 1] = ",";
    }
0
Michael Ross