2013-02-26 21 views
6

Così ho questo string []:Looping attraverso una regex sostituire

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

e voglio fare qualcosa di simile con esso:

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

In definitiva, sto solo chiedendo se si tratta di possibile in qualche modo eseguire il ciclo attraverso un Regex e quindi essere in grado di sostituire il string con valori diversi che sono memorizzati in un string[]. Non deve essere un ciclo foreach, e so che questo codice è ridicolo, ma ho chiesto di porre la domanda più chiara possibile. Per favore, commenta qualsiasi domanda tu abbia per me.

Grazie per tutto l'aiuto =)

+2

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

+3

[Non analizzare HTML con Regex] (http://stackoverflow.com/a/1732454/558018). – AgentFire

risposta

6

È possibile enumerare le stringhe di sostituzione. Dovresti personalizzarlo in base alle tue esigenze, ma immagino che qualcosa del genere funzionerebbe.

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

Una nota su questa soluzione è che questo corrisponderà a schemi sovrapposti e corrisponderà a qualsiasi testo di precedenti sostituzioni. Questo può o non può essere desiderato. –

6

salterò la discussione "non analizzare HTML con Regex" e suggeriscono che si guardano i sovraccarichi per Regex.Replace che prendono un delegato MatchEvaluator.

Fondamentalmente, è possibile passare un delegato al metodo Replace() che viene chiamato per ogni corrispondenza e restituisce il testo sostitutivo.

Questa pagina MSDN fornisce un esempio inserendo il numero di indice nel testo sostitutivo. Dovresti essere in grado di utilizzare l'indice nell'array per ottenere il testo sostitutivo.

Ecco un esempio che riflette il vostro esempio:

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

uscita:

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

Questa riga è eccezionale e merita più punti: response = Regex.Replace (risposta, @ "

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