2009-11-22 13 views
16

¿Cómo coinciden y reemplazar texto usando expresiones regulares en modo multilínea?Multilínea expresión regular en C#

sé la opción RegexOptions.Multiline, pero ¿cuál es la mejor manera de especificar partido todos con los caracteres de nueva línea en C#?

de entrada:

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

Salida:

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

Aahh, me encontré con el problema real. '&' y ';' en Regex están haciendo coincidir el texto en una sola línea, mientras que el mismo debe escaparse en Regex para que funcione en los casos en que también hay nuevas líneas.

+0

Huh? & and ; no hay caracteres especiales en expresiones regulares. ¿Puede dar un ejemplo? –

+0

Algo similar, aunque no he probado el siguiente ej. rx.Replace ("nombre [=] " abc "", "abc", "texto de líneas múltiples"); –

Respuesta

43

Si quiere decir que tiene como un carácter de nueva línea para que la expresión coincida, entonces \n lo hará por usted.

lo contrario, creo que podría haber entendido mal las banderas de varias líneas/SingleLine. Si desea que su expresión coincida en varias líneas, realmente desea utilizar RegexOptions.Singleline. Lo que significa es que trata la cadena de entrada completa como una sola línea, ignorando así las nuevas líneas. ¿Es esto lo que buscas ...?

Ejemplo

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

Quiero hacer coincidir algunos textos que también pueden contener nuevos caracteres de línea, pero no necesariamente. Ahora, si dices con RegexOptions.Singleline, ¿puedes mostrarme un ejemplo sobre cómo hacer esto? –

+0

mira mi edición para ver un ejemplo. Me parece haber sido confundido acerca de que sea aunque por defecto, cuando lo probé ... especificando manualmente sola línea como en el ejemplo, hace que el trabajo ejemplo, aunque –

+0

gracias, parece que el problema era diferente, pero gracias por despejar mis dudas sobre el modo multiline –

12

Aquí es una expresión regular para que coincida. Requiere la opción RegexOptions.Singleline, lo que hace que el . coincida con las nuevas líneas.

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

Después de esta expresión regular, el primer grupo contiene la etiqueta, la segunda el nombre de la etiqueta, y la tercera el contenido entre las etiquetas. Así cadena de reemplazo podría tener este aspecto:

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

En C#, esto se parece a:

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

+1: Muy buen código y explicación. @Priyank Bolia: Sólo recuerde que esto sólo funciona si s no se pueden anidar. Si * pueden * ser, las expresiones regulares le fallarán. –

+0

Gracias por el excelente ejemplo, pensé, era otro problema. –