2009-11-22 25 views
16

Come abbinare e sostituire il testo utilizzando le espressioni regolari in modalità multilinea?Espressione regolare multilinea in C#

Conosco l'opzione RegexOptions.Multiline, ma qual è il modo migliore per specificare la corrispondenza con tutti i caratteri della nuova riga in C#?

ingresso:

<tag name="abc">this 
is 
a 
text</tag> 

uscita:

[tag name="abc"]this 
is 
a 
test 
[/tag] 

Aahh, ho trovato il problema reale. '&' e ';' in Regex si abbina il testo in una singola riga, mentre la stessa necessità di essere sfuggita nel Regex per funzionare nei casi in cui ci sono anche nuove linee.

+0

Eh? & and ; non sono caratteri speciali nella regex. Puoi fare un esempio? –

+0

Qualcosa di simile, anche se non ho provato il sotto ex. rx.Replace ("nome [=] " abc "", "abc", "testo multilinea"); –

risposta

43

Se si intende che ha come carattere di nuova riga per l'espressione corrispondente, quindi lo \n lo farà per voi.

Altrimenti, penso che potresti aver frainteso le bandiere Multiline/Singleline. Se vuoi che la tua espressione corrisponda a più righe, in realtà vuoi usare RegexOptions.Singleline. Ciò significa che tratta l'intera stringa di input come una singola riga, ignorando quindi le nuove righe. E 'questo quello che stai cercando ...?

Esempio

Regex rx = new Regex("<tag name=\"(.*?)\">(.*?)</tag>", RegexOptions.Singleline); 
String output = rx.Replace("Text <tag name=\"abc\">test\nwith\nnewline</tag> more text...", "[tag name=\"$1\"]$2[/tag]"); 
+0

Voglio abbinare un testo che può contenere anche caratteri di nuova riga, ma non necessariamente. Ora, se dici con RegexOptions.Singleline, puoi mostrarmi un esempio su come farlo. –

+0

vedere la mia modifica per un esempio. Mi sembra che sia stato errato quando è stato eseguito il default, quando l'ho provato ... specificando manualmente singleline come nell'esempio, rende l'esempio funzionante, grazie a –

+0

grazie, sembra che il problema fosse diverso, ma grazie per aver chiarito i miei dubbi sulla modalità multilinea. –

12

Ecco una regex per abbinare. Richiede l'opzione RegexOptions.Singleline, che rende lo . corrispondente a una nuova riga.

<(\w+) name="([^"]*)">(.*?)</\1> 

Dopo questa regex, il primo gruppo contiene il tag, la seconda il nome del tag, e la terza il contenuto tra i tag. Così stringa di sostituzione potrebbe essere la seguente:

[$1 name="$2"]$3[/$1] 

In C#, questo appare come:

newString = Regex.Replace(oldString, 
    @"<(\w+) name=""([^""]*)"">(.*?)</\1>", 
    "[$1 name=\"$2\"]$3[/$1]", 
    RegexOptions.Singleline); 
+1

+1: codice e spiegazione molto buoni. @Priyank Bolia: ricorda che funziona solo se non è possibile nidificare s. Se * possono * essere, allora le espressioni regolari ti mancheranno. –

+0

Grazie per l'eccellente esempio, ho capito, era un altro problema però. –