2013-03-04 40 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()); 

這將搜索兩塊錢,然後搜索任何東西,不是美元或不是由一美元成功一美元。由於前瞻斷言,這種情況下的貪婪並不重要。

這比你使用的點星更高級,所以如果點星適合你,那麼堅持下去可能更現實。

相關問題