Как сохранить разделители Regex.Split?

Я хотел бы разбить строку, используя функцию Split в классе Regex. Проблема в том, что он удаляет разделители, и я хотел бы их сохранить. Предпочтительно, как отдельные элементы в сплайте.

В соответствии с другими обсуждениями, которые я нашел, есть только неудобные способы достижения этого.

Любые предложения?

Ответ 1

Просто поместите шаблон в группу захвата, и совпадения также будут включены в результат.

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

Результат:

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

Это также работает для многих других языков:

  • JavaScript: "123.456.789".split(/(\.)/g)
  • Python: re.split(r"(\.)", "123.456.789")
  • Perl: split(/(\.)/g, "123.456.789")

(но не Java)

Ответ 2

Используйте 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));

Ответ 3

Скажите, что вход "abc1defg2hi3jkl", а регулярное выражение - для выбора цифр.

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

Части были бы: abc 1 defg 2 hi 3 jkl

Ответ 4

Добавьте их обратно:

    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] = ",";
    }