2011-10-05 67 views
1

我想用C#.NET替換美元符號之間的每個文本實例。例如:RegEx替換美元符號之間的文本

Check out this TeX: $x\in\mathbb{Z}^+$. It's cool. 

... ...變得

Check out this TeX: <img src="http://chart.googleapis.com/chart?cht=tx&chl=x\in\mathbb{Z}^%2B" alt="x\in\mathbb{Z}^+" />. It's cool. 

注意該公式需要是它傳遞給谷歌圖表API之前URL編碼。

請你能告訴我如何使用正則表達式(或其他)來做到這一點?

回答

2

你可能要使用的Regex.Replace過載,它接受計算更換委託:

private string GetCodeForTex(Match match) 
{ 
    string tex = match.Groups[1].Value; 
    return string.Format(
     "<img src=\"{0}\" alt=\"{1}\" />", GetEscapedUrlForTex(tex), tex); 
} 

… 

Regex.Replace(textWithDollars, @"\$([^\$]*)\$", GetCodeForTex); 

你在GetCodeForTex MIG代碼不同(你可能會想到一個更好的名字),但我相信你明白了。

另外,要小心使用像這樣的正則表達式進行簡單的解析。這意味着你永遠不能使用$作爲除了封裝TeX之外的其他東西。如果您在輸入文本的某個地方未封閉$,結果會很糟糕。

+0

謝謝。你會使用什麼格式來代替$ tex $? – James

+0

對此沒有簡單的答案。特別是考慮到你可能想在TeX代碼中使用'$'(或者你選擇的任何其他簡單的分隔符)。真正強大的解決方案將是爲您的格式實現實際的解析器。或者,因爲它看起來像是在HTML環境中,所以可以使用現有的HTML解析器並使用類似'文本代碼'的東西。 – svick

4

下面是一個適用於您的示例方法。需要注意的是通過使用Regex.Matches方法,該方法能夠同時處理多個匹配:

public static string AddImgTags(string input) 
{ 
    string pattern = @"\$([^\$]*)\$"; 

    foreach (Match match in Regex.Matches(input, pattern)) 
    { 
     input = input.Replace(match.Value, 
     string.Format("<img src=\"http://chart.googleapis.com/chart?cht=tx&chl={0}\" alt=\"{0}\" />", 
     HttpUtility.UrlEncode(match.Value))); 
    } 

    return input; 
} 

圖案的解釋(「\$[^\$]*\$」)如下:

  • \$ - 匹配該開始$
  • ([^\$]*) - 匹配除$以外的任何字符,重複出現0次或更多次。還將匹配的字符分組,以便稍後可以引用它們。
  • \$ - 比賽結束$
+0

謝謝。什麼應該'替代'看起來像?難點在於美元符號之間的文本在傳遞給圖像url之前需要進行URL編碼。 – James

+0

我認爲你不能使用這種方法,當替換時必須包含*修改*版本的捕獲文本。 – svick

+0

@svick謝謝,正在研究這個變化。 – Donut

1

一般的正則表達式將是

var s = Regex.Replace("test $blabla$! It worked", @"\$.*?\$", "123"); 

s將成爲"test 123! It worked"

0

其他的答案會做一個簡單的替換,但他們不搶該組,並將其放入您的替代品中。

所以,先從@甜甜圈的註冊防爆,有一個微小的變化添加捕獲組

\$([^\$]*)\$

另一個變化是調用Regex.Match,這樣你就可以抓住$內的文本使用Match .Captures。然後,您可以在其上運行URL編碼來構建替換文本。

喜歡的東西:

var urlTemplate = "<img src="http://chart.googleapis.com/chart?cht=tx&chl={0}" alt="{1}" />"; 
var matchText = match.Captures[0].Value; 

var url = string.Format(urlTemplate, UrlEncode(matchText), matchText); 

既然你確切地知道現在的文字是什麼,你可以做一個正常的更換此實例,然後循環,找到匹配的其餘

+0

如果有多個子字符串需要替換,該怎麼辦? – svick

+0

此外,你的正則表達式是錯誤的。你想在'[]'字符組之外有'*'。 – svick

+0

對正則表達式的反應 - 正如我所說我只是從@Donut接受它,因爲他沒有在更換期間解決URL編碼問題。感謝有關接受委託的信息,我沒有意識到這一點。 – davisoa