正则表达式贪心问题(C#)

时间:2011-03-11 16:59:27

标签: c# regex greedy regex-greedy

我有一个输入字符串,如“=== text ===和=== text ===”,我想用相应的html标签替换wiki语法。

输入:

===text=== and ===text===

理想的输出:

<h1>text</h2> and <h1>text</h2>

但是使用以下代码我得到了这个输出:

var regex = new Regex("---(.+)---");
var output = regex.Replace("===text=== and ===text===", "<h1>$1</h1>");

<h1>text=== and ===text</h1>

我知道问题是我的正则表达式与贪婪相匹配。但是如何让他们不贪心。

谢谢你,亲切的问候。丹尼

5 个答案:

答案 0 :(得分:14)

question mark添加到正则表达式:===(。+?)===

更好的选择是使用以下形式的正则表达式:===([^ \ =] +)===。 有关使用点的说明,请参见点字符上的this guide。在对我提供的正则表达式进行基准测试时,它是大约。比正则表达式快50%。

答案 1 :(得分:3)

为了让正则表达式不贪心你用吗?

所以表达式“===(。+?)===”会有两个匹配 - 所以应该允许你生成<h1>text</h1><h1>text</h1>

答案 2 :(得分:0)

简单地说?可能吗?

===.+?===

答案 3 :(得分:0)

我会添加另一个变体:===((?:(?!===).)*)===(遇到===时停止捕捉任何角色)...哦......以及WiseGuyEh建议的.问题,我建议使用RegexOptions.SingleLine,以便.匹配换行符。

答案 4 :(得分:0)

只是为了获取信息,如果其他人遇到了同样的问题,那么为了避免匹配====Text====而不是===Text===我已经扩展了这样的模式:(?<!=)===([^=]+)===(?!=)