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开始和结束 $$ 分隔符之间也是大写的。

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

4

4 回答 4

2

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

var regex = new Regex(@"\$\$.*?\$\$");
var input = "this $$is a$$ test of the $$procedure$$";
var output =
     r.Replace(input, m=>m.Value.ToUpper());
于 2013-03-04T16:11:02.883 回答
2

试试这个,它应该可以工作:

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

我已经对其进行了测试:http ://rubular.com/r/YRI3WrzXAu

于 2013-03-04T16:19:03.593 回答
1

您需要使用 lazy*?而不是 eager **其本身试图尽可能多地*?匹配,尽可能少地匹配。

var html = Regex.Replace(html, @"\$\$(.*?)\$\$", m=> m.Value.ToUpper());
于 2013-03-04T16:12:54.050 回答
1

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

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

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

这比您一直使用的 dot-star 高级一点,所以如果 dot-star 适合您,那么坚持使用它可能更现实。

于 2013-03-04T16:23:54.297 回答