2013-03-04 43 views
1

我正在寻找一个正则表达式,它寻找任何$$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也在开始和结束$$分隔符之间大写。

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

回答

2

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

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

啊贪心是我的失​​败!谢谢你会尝试一下。 – Rippo 2013-03-04 16:13:09

+0

与所有字符串操作一样,输出将根据区域设置而有所不同。从长远来看,指定区域设置(或不变量)可能会更好。 – spender 2013-03-04 16:15:26

+0

顺便说一句,我刚刚注意到你不使用'(。*)',而只是'。*',我认为它与我使用的无关。 – Rippo 2013-03-06 15:47:53

1

您需要使用懒*?,而不是急于*的。 *本身试图尽可能地匹配,*?尽可能少地尝试匹配。

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

试试这个,它应该工作:

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

我有测试上:http://rubular.com/r/YRI3WrzXAu

1

另一个选择可能是使用前向断言。例如:

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

这将搜索两块钱,然后搜索任何东西,不是美元或不是由一美元成功一美元。由于前瞻断言,这种情况下的贪婪并不重要。

这比你使用的点星更高级,所以如果点星适合你,那么坚持下去可能更现实。

相关问题