我有这个字符串
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;
答案 0 :(得分:5)
这两项更改可以帮助您:
.*?
)。\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;'之外,你可以匹配任何内容:[^<]*
我通常选择最后一个因为它更容易记住并且在大多数情况下都有效。