正则表达式在分隔符之间大写

时间:2013-03-04 16:07:54

标签: c# regex

我正在寻找一个查找任何$$some_val$$的正则表达式,并用大写字母替换some_val

例如输入为: -

<p><a href='accept/272/$$id$$'>YES</a></p>
<p>Hi $$FirstName$$ some more text $$date$$ lorem ipsum</p>
<h1>$$club$$</h1>
$$content$$

会输出: -

<p><a href='accept/272/$$ID$$'>YES</a></p>
<p>Hi $$FIRSTNAME$$ some more text $$DATE$$ lorem ipsum</p>
<h1>$$CLUB$$</h1>
$$CONTENT$$

目前我有以下正则表达式: -

var html = Regex.Replace(html, @"\$\$(.*)\$\$", m=> m.Value.ToUpper());

但它会产生错误的结果。

<p><a href='accept/272/$$ID$$'>YES</a></p>
<p>Hi $$FIRSTNAME$$ SOME MORE TEXT $$DATE$$ lorem ipsum</p>
<h1>$$CLUB$$</h1>
$$CONTENT$$

因为SOME MORE TEXT也在开始和结束$$分隔符之间大写。

请注意,$$可能会在一行中重新出现或开始/结束。

4 个答案:

答案 0 :(得分:2)

你只需要使用非贪婪/懒惰的匹配量词(*?):

var regex = new Regex(@"\$\$.*?\$\$");
var input = "this $$is a$$ test of the $$procedure$$";
var output =
     r.Replace(input, m=>m.Value.ToUpper());

答案 1 :(得分:2)

试试这个,它应该有效:

var html = Regex.Replace(html, @"\$\$(.\w*)\$\$", m=> m.Value.ToUpper());

我测试了它:http://rubular.com/r/YRI3WrzXAu

答案 2 :(得分:1)

您需要使用惰性*?而不是急切的**本身会尝试尽可能匹配,*?尝试尽可能少地匹配。

var html = Regex.Replace(html, @"\$\$(.*?)\$\$", m=> m.Value.ToUpper());

答案 3 :(得分:1)

另一种选择可能是使用先行断言。例如:

var html = Regex.Replace(html, @"\$\$(?:[^$]|\$(?!\$))*\$\$", m => m.Value.ToUpper());

这将搜索两美元,然后搜索任何不是美元的东西或不是由另一美元继承的美元。在这种情况下,由于前瞻性断言,贪婪无关紧要。

这比你一直使用的点星更先进,所以如果dot-star适合你,那么坚持下去可能更为现实。