2011-06-05 24 views
5

Básicamente, mi objetivo es eliminar todo lo que está dentro() salvo las cadenas que están dentro de "".Eliminar todo entre dos caracteres, siempre que no estén dentro Algunos otros caracteres

estaba siguiendo el código aquí: Remove text in-between delimiters in a string (using a regex?)

Y eso funciona muy bien; pero tengo el requisito adicional de no eliminar() s si están en "". Es algo que se puede hacer con una expresión regular. Siento que estoy peligrosamente cerca de necesitar otro enfoque, como un verdadero analizador sintáctico.

Este es el lo que he estado usando ....

string RemoveBetween(string s, char begin, char end) 
{ 
    Regex regex = new Regex(string.Format("\\{0}.*?\\{1}", begin, end)); 
    return regex.Replace(s, string.Empty); 
} 
+1

¿Hay también un requisito que el usuario puede insertar una comilla doble dentro de las comillas dobles utilizando un carácter de escape? ("El perro dijo \" Woof \ "") –

+0

@Andrew - nope. –

+0

Probablemente debería haber .... –

Respuesta

3

. Las expresiones regulares de .NET son incluso más potentes que las habituales y seguramente puede hacer lo que quiera. Eche un vistazo a esto, que busca paréntesis equilibrados, que es esencialmente el mismo problema que el suyo, pero con paréntesis y no comillas.

http://blogs.msdn.com/bclteam/archive/2005/03/15/396452.aspx

2

Es arriesgado decir "no se puede" en este foro, porque alguien va a ir y arruinarlo proporcionando un trabajo responder. :-)

Pero diré que esto sería realmente estirar las expresiones regulares, y su problema se presta elegantemente a Automata-based programming.

Personalmente, estoy más feliz manteniendo una máquina de estado finito de 20 líneas que una expresión regular de 10 caracteres.

+0

Y listo ... ahí está la respuesta de trabajo :) – Bohemian

+0

@Bohemian - Me siento justificado por dos razones 1) Alguien me dio una respuesta 2) Todavía preferiría veinte líneas del código FSA :-) –

+0

sí, la expresión regular es el código de solo escritura – Bohemian

3

no hablo C, pero en este caso es la aplicación java:

input.replaceAll("(?<=\\().*?(?=[\"()])(\"([^\"]*)\")?.*(?=\\))", "$2"); 

Esto produce los siguientes resultados:

"foo (bar \"hello world\" foo) bar" --> "foo (hello world) bar" 
"foo (bar foo) bar" --> "foo() bar" 

No estaba claro si quería conservar las comillas - si lo hizo, use $ 1 en lugar de $ 2

Ahora que tiene la expresión regular funcional, debería poder hacer que funcione en C.

+0

Esto no funciona en la implementación de .NET. Lo intenté aquí: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx –

+0

@Andrew - tiene que haber una manera de hacerlo funcionar de alguna manera - ¿Seguramente incluso .NET tiene entrega de expresiones regulares estándar de la industria? – Bohemian

+0

Solo uno +1 para esa impresionante expresión regular ... * llorar * – Bohemian

Cuestiones relacionadas