Regex разбивает строку, но сохраняет разделители - PullRequest
8 голосов
/ 26 мая 2010

Я хотел бы сделать 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 ]

11 голосов
/ 26 мая 2010

Использовать механическую обработку нулевой длины; Вы хотите разделить на

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

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

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

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

Смотри также

Похожие вопросы


Пример на 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]"
1 голос
/ 26 мая 2010

Вы можете использовать .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`.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...