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

6
我有一个输入字符串,类似于 "===文本===和===文本===",我想用相应的HTML标记替换维基语法。
输入:
===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>

我知道问题在于我的正则表达式是贪婪匹配的,但如何使它们变成非贪婪匹配。

谢谢并致以亲切的问候。丹尼


试试这个:http://regexr.com?2t9he - Brad Christie
5个回答

14

问号添加到你的正则表达式中:===(.+?)===

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


3
使正则表达式不贪婪需要使用 ? 符号。因此,表达式 "===(.+?)===" 将为您生成两个匹配项 - 这样应该允许您生成 <h1>text</h1><h1>text</h1>

0

只需加一个?,也许可以吗?

===.+?===

0
我再提供另一种变体:===((?:(?!===).)*)===(遇到===时停止捕获任何字符)...哦...对于WiseGuyEh提出的.问题,我建议使用RegexOptions.SingleLine,这样.可以匹配换行符。

0

仅供参考,如果其他人遇到了与我相同的问题 - 为了避免匹配===Text===之外的====Text====,我将模式扩展如下:(?<!=)===([^=]+)===(?!=)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接