1

any を探して大文字$$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 html = Regex.Replace(html, @"\$\$(.\w*)\$\$", m=> m.Value.ToUpper());

私はそれをテストしました:http://rubular.com/r/YRI3WrzXAu

于 2013-03-04T16:19:03.593 に答える
1

もう 1 つのオプションは、先読みアサーションを使用することです。例えば:

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

これは、2 ドルを検索し、次に、1 ドルまたは別の 1 ドルが引き継がれていない 1 ドルではないものを検索します。この場合の貪欲さは、先読みアサーションにより問題になりません。

これは、これまで使用してきた dot-star よりも少し高度なので、dot-star が機能する場合は、それを使い続ける方が現実的かもしれません。

于 2013-03-04T16:23:54.297 に答える