2013-02-26 51 views
6

所以我有這個字符串[]:通過正則表達式循環替換

string[] middleXMLTags = {"</Table1><Table2>", "</Table2><Table3>"}; 

我想要做這樣的事情吧:

int i = 0; 
foreach (regex where it finds the replacement string) 
{ 
    response = Regex.Replace(response, "</Table><Table>", middleXMLTags[i]); 
    i++; 
} 
response = Regex.Replace(response, "<Table>", <Table1>); 
response = Regex.Replace(response, "</Table>", </Table3>); 

最終,我只是問,如果它是可能以某種方式循環通過Regex,因此能夠用存儲在string[]中的不同值替換string。它不一定是一個foreach循環,我知道這段代碼很荒謬,但我聽到它提出了最明確的問題。請評論您對我的任何問題。

感謝所有幫助=)

+2

看看[Regex.Matches](http://msdn.microsoft.com/zh-CN/library/system.text.regularexpressions.regex.matches.aspx)。 – 2013-02-26 17:44:38

+3

[不要使用正則表達式解析HTML](http://stackoverflow.com/a/1732454/558018)。 – AgentFire 2013-02-26 18:16:09

回答

6

您可以通過替換字符串枚舉。您必須根據您的需求量身定製它,但我想象這樣的事情會起作用。

Regex needle = new Regex("\[letter\]"); 
string haystack = "123456[letter]123456[letter]123456[letter]"; 
string[] replacements = new string[] { "a", "b", "c" }; 

int i = 0; 
while (needle.IsMatch(haystack)) 
{ 
    if (i >= replacements.Length) 
    { 
     break; 
    } 

    haystack = needle.Replace(haystack, replacements[i], 1); 
    i++; 
} 
+1

關於此解決方案的一個注意事項是,這將匹配重疊模式以及匹配較早替換中的任何文本。這可能會或可能不會被期望。 – 2013-02-27 13:23:39

6

我會跳過「不解析HTML與正則表達式」的討論,並建議你看那個採取MatchEvaluator委託重載Regex.Replace。

基本上,您可以將委託傳遞給爲每個匹配調用的Replace()方法,並返回替換文本。

這個MSDN頁面給出了一個例子把索引號放入替換文本中。您應該能夠使用數組中的索引來獲取替換文本。

這裏是反映你的榜樣樣本:

string[] middleXMLTags = {"</Table1><Table2>", "</Table2><Table3>"}; 

string response = "</Table><Table><foo/></Table><Table>"; 
Console.WriteLine(response); 
int i = 0; 

response = Regex.Replace(response,@"</Table><Table>",m=>middleXMLTags[i++]); 
Console.WriteLine(response); 

輸出:

</Table><Table><foo/></Table><Table> 
</Table1><Table2><foo/></Table2><Table3> 
+0

這條線很棒,值得多點: response = Regex.Replace(response,@「

」,m => middleXMLTags [i ++]); – Richard2013-09-17 13:34:58