正则表达式匹配c#中定义的标签

时间:2012-03-25 19:00:10

标签: c# regex

我有这个字符串

 This is a <143>sample</143> regex <143>pa<665>t</665>tern</143> selection <143>by</143> tags in <128>c#</128> and my <132>name</132> is <175>Vincent</175>

我想按标签来比赛。我用它来突出显示文字。

预期产出:

<143>sample</143>
<143>pa<665>t</665>tern</143>
<665>t</665>
<143>by</143>
<128>c#</128>
<132>name</132>
<175>Vincent</175>

我试过这个正则表达式模式:

<(143|128|132|175)>.*</(143|128|132|175)> 

但它会将所有结果打印为匹配,整个字符串。

请帮助。


跟进问题

而不是获得整行匹配,我可以单独获取标签内的文本吗?就像我只是得到样本而不是&lt; 143&gt;样本&lt;`/ 143&gt;

3 个答案:

答案 0 :(得分:5)

这两项更改可以帮助您:

  • 使用non-greedy匹配(.*?)。
  • 使用backreference\1),以便您只匹配相同的开始和结束标记。

试试这个:

<(143|128|132|175)>.*?</\1> 

关于“啊,是的,我忘了..它是嵌套标签”:那么使用正则表达式可能不明智。嵌套标签不是常规语言。

答案 1 :(得分:1)

正如所说,你应该在这里使用懒惰匹配。通过将?附加到量词来实现。在您的情况下,它是*

此外,为了简化您的工作,您可以使用命名捕获。它完全支持.NET。这是一个示例代码

var target = @"This is a <143>sample</143> regex <143>pattern</143> selection <143>by</143> tags in <128>c#</128> and my <132>name</132> is <175>Vincent</175>";
var pattern = new Regex("<(143|128|132|175)>(?<Content>.*?)</\\1>", RegexOptions.IgnoreCase);
var result = pattern.Matches(target);
for (var j = 0; j < result.Count; j++) {
    var capts = result[j].Groups["Content"].Captures;
    for (var i = 0; i < capts.Count; i++) {
        Console.WriteLine(capts[i].Value);
    }
}

答案 2 :(得分:0)

这是因为。*贪婪..

您可以通过添加?:.*?

使其变得非贪婪

除了'&gt;'之外,你可以匹配任何内容:[^<]*

我通常选择最后一个因为它更容易记住并且在大多数情况下都有效。