2013-02-26 22 views
6

So habe ich diese Zeichenfolge []:durch eine regex Looping ersetzen

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

Und ich will mit ihm etwas zu tun:

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>); 

Letztlich bin gefragt, ich nur, wenn es möglich, irgendwie eine Regex Schleife durchlaufen und daher in der Lage, die string mit verschiedenen Werten, die in einem string[] gespeichert sind, zu ersetzen. Es muss keine foreach Schleife sein, und ich weiß, dass dieser Code lächerlich ist, aber ich lege es an, um die klarste Frage zu stellen. Bitte kommentieren Sie alle Fragen, die Sie für mich haben.

Vielen Dank für alle Hilfe =)

+2

Blick auf [Regex.Matches] (http://msdn.microsoft.com/en-GB/library/system.text.regularexpressions.regex.matches.aspx). –

+3

[HTML nicht mit Regex analysieren] (http://stackoverflow.com/a/1732454/558018). – AgentFire

Antwort

6

Sie können die Ersatzsaiten aufzählen durch. Sie müssten es an Ihre Bedürfnisse anpassen, aber ich könnte mir vorstellen, dass so etwas funktionieren würde.

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

Eine Anmerkung zu dieser Lösung ist, dass damit überlappende Muster übereinstimmen und Text von früheren Ersetzungen übereinstimmt. Dies kann oder kann nicht erwünscht sein. –

6

Ich werde die „parsen nicht mit Regex HTML“ Diskussion überspringen und lassen vermuten, dass man sich den Überlastungen für Regex.Replace suchen, die einen MatchEvaluator Delegierten nehmen.

Grundsätzlich können Sie einen Delegaten an die Replace() -Methode übergeben, die für jede Übereinstimmung aufgerufen wird und den Ersatztext zurückgibt.

Diese Seite MSDN enthält ein Beispiel, in dem die Indexnummer in den Ersetzungstext eingefügt wird. Sie sollten den Index in Ihrem Array verwenden können, um den Ersatztext zu erhalten.

Hier ist eine Probe Ihr Beispiel reflektieren:

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); 

Ausgang:

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

Diese Zeile ist genial und verdient mehr Punkte: Antwort = Regex.Replace (Antwort, @ "

", m => middleXMLTags [i ++]); – Richard