问题
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