regex greedy problem (C#)

痴心易碎 提交于 2019-12-12 10:43:28

问题


I've a input string like "===text=== and ===text===" and I want to replace wiki syntax with the corresponding html tag.

input:

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

desirable output:

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

but with the following code I get this output:

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

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

I know the problem is that my regex matches greedy. But how to make them non greedy.

Thank you and kind regards. Danny


回答1:


Add the question mark to your regex: ===(.+?)===

A better alternative would be to have a regex of the following form: ===([^\=]+)===. See this guide on the dot character for an explanation of using the dot sparingly. When benchmarking my supplied regex, it is approx. 50% faster than your regex.




回答2:


To make a Regex not greedy you use ?

So the expression "===(.+?)===" would have two matches for you - so should allow you to generate <h1>text</h1> and <h1>text</h1>




回答3:


Simply dd a ? maybe?

===.+?===



回答4:


I'll add another variant: ===((?:(?!===).)*)=== (stop catching any character when you encounter ===)... Oh... and for the . problem suggested by WiseGuyEh, I suggest RegexOptions.SingleLine, so that the . match even the newline.




回答5:


And just for info if others have the same issue then I had - to avoid matching also ====Text==== instead of ===Text=== I've extended the pattern like this: (?<!=)===([^=]+)===(?!=)



来源:https://stackoverflow.com/questions/5275904/regex-greedy-problem-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!