正则表达式拆分包含标记的文本

时间:2010-06-30 20:31:01

标签: c# .net regex

如果我有一个字符串,例如“abcdef {123} ghi {456} kl”,我想创建一个正则表达式,它将按如下方式分隔所有部分:

abcdef
{123}
ghi
{456}
kl

我正在使用此代码,但无法弄清楚表达式应该是什么:

System.Text.RegularExpressions.Regex rex = new System.Text.RegularExpressions.Regex("expression");
foreach (System.Text.RegularExpressions.Match match in rex.Matches(sText).OfType<System.Text.RegularExpressions.Match>())
{
     ...  
}

2 个答案:

答案 0 :(得分:3)

您应该使用using语句,而不是每次都完整地写出命名空间。乍一看,您的代码看起来相当复杂,但是当您删除所有命名空间时,它变得非常简单。此外,不需要OfType

正则表达式应该尽可能匹配,这不是开括号[^{]*,或者是开括号,一些文本然后是右括号{[^}]*}。正则表达式为:

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

试试这段代码:

string text = "abcdef{123}ghi{456}kl";
Regex regex = new Regex("{[^}]*}|[^{]*");
foreach (Match match in regex.Matches(text))
{
    Console.WriteLine(match.Value);
}

输出:

abcdef
{123}
ghi
{456}
kl

注意:此正则表达式不会验证字符串的格式是否正确,它假定格式正确。

一种稍微简单的方法是使用Split而不是Matches并在正则表达式中包含一个捕获组,以便分隔符也包含在输出中:

string text = "abcdef{123}ghi{456}kl";
Regex regex = new Regex("({[^}]*})");
foreach (string part in regex.Split(text))
{
    Console.WriteLine(part);
}

此输出与上述相同。

答案 1 :(得分:0)

([a-z]+)({\d+})([a-z]+)({\d+})([a-z]+)

将起作用,但前提是字符串中始终有五个部分。可以少于/多于五个吗?