正则表达式分裂围绕卷曲括号

时间:2014-07-31 04:50:16

标签: c# regex string split

我有一个字符串:

"abc{d}efg{hi}{jk}lm{n}"

我希望将它分成:

"abc","{d}","efg","{hi}","{jk}","lm","{n}"

我使用了这种模式[{}],结果是"abc","d","efg","hi","","jk","lm","n"

如何保留'{''}'?如何删除""'}'之间的空'{'

5 个答案:

答案 0 :(得分:6)

使用全部匹配而不是分割

请记住Match All and Split are Two Sides of the Same Coin

使用此正则表达式:

{[^}]*}|[^{}]+

查看 DEMO 中的匹配项。

查看匹配项:

var myRegex = new Regex("{[^}]*}|[^{}]+");
Match matchResult = myRegex.Match(yourString);
while (matchResult.Success) {
    Console.WriteLine(matchResult.Value);
    matchResult = matchResult.NextMatch();
} 

<强>解释

  • 在替换|的左侧,{[^}]*}匹配{content in braces}
  • 在右侧,[^{}]+匹配任何不是curlies的字符

答案 1 :(得分:1)

使用外观断言的组合:

String s = @"abc{d}efg{hi}{jk}lm{n}";
String[] parts = Regex.Split(s, @"(?<=^|})|(?={)");
foreach (string value in parts)
         Console.WriteLine(value);

输出

abc
{d}
efg
{hi}
{jk}
lm
{n}

答案 2 :(得分:1)

没有经过测试,但希望这会在你的分裂中起作用:

(?={)|(?<=})

答案 3 :(得分:0)

尝试以下方法:

解析弦直到你到达一个开口支撑。输出子串直到该位置。在开口支撑之后解析子串,直到找到闭合支撑。使用大括号输出大括号之间的子串。继续此算法,直到字符串结束。

答案 4 :(得分:0)

这是一个简单的方法

string to_split = "abc{d}efg{hi}{jk}lm{n}";
            var splited = Regex.Matches(to_split, @"\{[\w]*\}|[\w]*");
            foreach (Match match in splited)
            {
                Console.WriteLine(match.ToString());
            }