2009-06-15 20 views
5

Me han encargado encontrar a Elvis (usando la búsqueda de eclipses). ¿Hay alguna expresión regular que pueda usar para encontrarlo?Buscando a Elvis?:

El "Operador de Elvis" (?:) es una abreviatura del operador ternario de Java.

He intentado \?[\s\S]*[:] pero no coincide con multilínea.
¿Existe una refactorización en la que pueda convertir a Elvis en un bloque de if-else?

+3

¿Esto es así en Groovy? Si es así, sería realmente útil que lo dijera. (En realidad es el operador condicional en Java, por cierto, "ternario" simplemente describe cuántos operandos tiene. Es * un * operador ternario, y actualmente el único, pero su nombre es el operador condicional). –

+7

Jon Skeet es Elvis. – abmv

+0

Mirando la referencia de Groovy, llama al valor del operador binario:? valor 'el operador de Elvis, y el operador ternario' booleano? valor: valor 'a "operador ternario tradicional". ¿Estás hablando del operador de Elvis o de un operador condicional? Si es el operador de Elvis, puede buscar "?:" –

Respuesta

4

Editar Lo sentimos, había publicado una expresión regular para el operador ternario, si su problema es multilínea se puede usar esto:

\?(\p{Z}|\r\n|\n)*:
+2

Cadena hello = "No soy un 'operador elvis'? ¿Estás seguro, inseguro"; – workmad3

+8

"¡Lo sé, usaré expresiones regulares!" Ahora tiene 2 problemas ... –

+0

Cadena bbcode = "¿Eh?: Confundido:" – Svante

2

Tendrá que coincidir explícitamente delimitadores de línea si desea partido a través de múltiples líneas. \ R coincidirá con cualquiera de ellos (independiente de la plataforma), en Eclipse 3.4 de todos modos, o puede usar el adecuado para su archivo (\ r, \ n, \ r \ n). P.ej. \?.*\R*.*: funcionará si solo hay un salto de línea. Sin embargo, no puedes usar \ R en una clase de personaje, por lo que si no sabes cuántas líneas puede abarcar el operador, tendrás que construir una clase de caracteres con tu delimitador de línea y cualquier carácter que pueda aparecer en una operando. Algo así como ([-\r\n\w\s\[\](){}=!/%*+&^|."']*)\?([-\r\n\w\s\[\](){}=!/%*+&^|."']*):([-\r\n\w\s\[\](){}=!/%*+&^|."']*). He incluido paréntesis para capturar los operandos como grupos para que pueda encontrarlos y reemplazarlos.

Sin embargo, tiene un problema bastante grande si se trata de Java (y probablemente de cualquier otro idioma). El operador ternario condicional?: Crea una expresión, mientras que una instrucción if no es una expresión. Considere:

boolean even = true; 
int foo = even ? 2 : 3; 
int bar = if (even) 2 else 3; 

La tercera línea es sintácticamente incorrecta; las dos construcciones condicionales no son equivalentes. (Lo que realmente obtendría de la segunda línea si utilizó mi regex para buscar y reemplazar es if (int foo = even) 2 else 3; que tiene problemas adicionales.)

Entonces, puede encontrar los operadores?: Con la expresión regular anterior (o algo similar; Es posible que haya omitido algunos caracteres que necesita incluir en la clase), pero no necesariamente podrá reemplazarlos con declaraciones 'if'.

+0

'int foo = even? 2: 3; 'necesitaría ser refactorizado a algo como' if (even) {int foo = 2; } else {int foo = 3; }; 'en la mayoría de los lenguajes tipo C. – Svante

+0

@Swante Supongo que el alcance de foo sería erróneo. No podrás usarlo fuera del if/else – David