Regex разбивает строку, но сохраняет разделители
Я хотел бы сделать Regex.Split для некоторых разделителей, но я хотел бы сохранить разделители. Чтобы привести пример того, что я пытаюсь:
"abc[s1]def[s2][s3]ghi" --> "abc", "[s1]", "def", "[s2]", "[s3]", "ghi"
Регулярное выражение, которое я придумал, new Regex("\\[|\\]|\\]\\[")
, Тем не менее, это дает мне следующее:
"abc[s1]def[s2][s3]ghi" --> "abc", "s1", "def", "s2", "", "s3", "ghi"
Разделители исчезли (что имеет смысл, учитывая мое регулярное выражение). Есть ли способ написать регулярное выражение, чтобы сохранить сами разделители?
2 ответа
Решение
Используйте механическую обработку нулевой длины; Вы хотите разделить на
(?=\[)|(?<=\])
То есть везде, где мы утверждаем совпадение буквального [
вперед, или где мы утверждаем совпадение буквального ]
позади.
Как строковый литерал C#, это
@"(?=\[)|(?<=\])"
Смотрите также
Смежные вопросы
- Сплит Java пожирает моих персонажей. - есть много примеров
Пример на Java
System.out.println(java.util.Arrays.toString(
"abc[s1]def[s2][s3]ghi".split("(?=\\[)|(?<=\\])")
));
// prints "[abc, [s1], def, [s2], [s3], ghi]"
System.out.println(java.util.Arrays.toString(
"abc;def;ghi;".split("(?<=;)")
));
// prints "[abc;, def;, ghi;]"
System.out.println(java.util.Arrays.toString(
"OhMyGod".split("(?=(?!^)[A-Z])")
));
// prints "[Oh, My, God]"
Вы могли бы использовать .Matches
вместо .Split
Пример ( http://www.ideone.com/gUjRM):
string x = "abc[s1]def[s2][s3]ghi";
var r = new Regex(@"[^\[]+|\[[^\]]+\]");
var ms = r.Matches(x);
// do stuff with the MatchCollection `ms`.