正则表达式拆分字符串但保留分隔符

时间:2010-05-26 06:25:47

标签: c# regex split

我想在某些分隔符上做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 个答案:

答案 0 :(得分:11)

使用零长度加工外观;你想分开

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

也就是说,我们在前面声明一个文字[的匹配位置,或者我们在后面声明一个文字]的匹配位置。

作为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 :(得分:1)

您可以使用.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`.