Как сохранить разделители 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] = ",";
}