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" 

Сепараторы исчезли (что имеет смысл с учетом моего регулярного выражения). Есть ли способ написать регулярное выражение, чтобы сами разделители сохранялись?

Используйте обратные изображения с нулевой длиной; вы хотите разделить

 (?=\[)|(?<=\]) 

То есть, где-нибудь, где мы утверждаем соответствие литерала [ впереди, или где мы утверждаем соответствие литерала ] позади.

Как литерал строки C #, это

 @"(?=\[)|(?<=\])" 

Смотрите также

  • regular-expressions.info/Lookarounds

Связанные вопросы

  • Разделение 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("(?=(?!^)[AZ])") )); // 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`. 
  • Java String.split () иногда дает пустые строки
  • Разделить строку на массив в Bash
  • Есть ли функция для разделения строки в PL / SQL?
  • Строка Java, разделенная на "." (Точка)
  • Как разбить строку на подстроки заданной длины?
  • Как эффективно анализировать CSV-файл в Perl?
  • Как подмножество кадра данных в фактор и повторить график для каждого подмножества?
  • Самый простой способ разделить строку на новые строки в .NET?
  • Регулярное выражение для разделения строки с использованием пробела, если оно не окружено одинарными или двойными кавычками
  • Java: как разбить строку на несколько символов?
  • C # Разделить строку на другую строку
  • Давайте будем гением компьютера.