2011-03-21 8 views
9

La siguiente expresión regular coincidirá con "Sábado" o "Domingo": (?:(Sat)ur|(Sun))day¿Cuál es el equivalente del operador de reinicio de bifurcación ("? |") Que se encuentra en php (pcre) en C#?

Pero en un caso retro-referencia 1 se llena mientras retrorreferencia 2 está vacío y en el otro caso viceversa.

PHP (pcre) proporciona un buen operador "? |" que elude este problema La expresión regular anterior se convertiría en (?|(Sat)ur|(Sun))day. Entonces no habrá backreferences vacías.

¿Hay un equivalente en C# o alguna solución alternativa?

+2

Podría usar '(? :(Sat (? = Ur) | Sun (?! Ur)) (?: ur)?) Day' en su lugar. :) – Gumbo

+0

@Gumbo ¿por qué Sun no ha seguido a "ur"? La expresión regular es un poco complicada ... – Stephan

+0

de lo contrario, 'Sunurday' podría coincidir. Que es un poco como el error que cometí (que _acuerdaste :)) –

Respuesta

12

.NET no es compatible con el operador de reinicio de bifurcación, pero admite grupos con nombre, y le permite reutilizar nombres de grupo sin restricción (algo que no hace ningún otro sabor, AFAIK). Lo que podría utilizar esto:

(?:(?<abbr>Sat)ur|(?<abbr>Sun))day 

... y el nombre abreviado se almacenarán en Match.Groups["abbr"].

+0

Sí, ese es el camino a seguir (en el caso de una expresión regular). Ordenado. –

+0

es una respuesta inteligente. – Stephan

+1

Perl le permite reutilizar grupos con nombre en el mismo patrón. No hay restricción Eso también le permite recuperar una lista de grupos con nombre que coinciden. – tchrist

3

debe ser posible concat reenviar 1 y reenviar 2.
Como uno de cada uno es siempre vacío y una cadena con concat vacío sigue siendo la misma cadena ...

con su expresión regular (?:(Sat)ur|(Sun))day y sustitución $1$2
se obtiene Sat para Saturday y Sun para Sunday.

 
regex (?:(Sat)ur|(Sun))day 
input | backref1 _$1_ | backref2 _$2_ | 'concat' _$1$2_ 
---------|---------------|---------------|---------------- 
Saturday | 'Sat'   | ''   | 'Sat'+'' = Sat 
Sunday | ''   | 'Sun'   | ''+'Sun' = Sun 

en lugar de leer o backref1 backref2 acaba de leer ambos resultados y ConCat el resultado.

+0

prefiero tener los resultados directamente sin ninguna manipulación en la cadena de entrada (como operador de reinicio de bifurcación). – Stephan

+0

@Stephan No entiendo tu comentario? No creo que haya manipulado la cadena de entrada. Acabo de señalar que puede concat a group1 y group2 del resultado de expresiones regulares sin cambios en la expresión regular. –

+0

@ bw_üezi puede editar su respuesta con un código de muestra detallado porque todavía no entiendo su solución. – Stephan

0

Usted puede utilizar el operador rama-reset:

(?|foo(bar)|still(life)|(like)so) 

que sólo un grupo establecido, no importa que coincide con sucursales.

+0

Y aquí pensé que StackOverflow era el lugar para buscar calidad, no cantidad en respuestas. – ensisNoctis

Cuestiones relacionadas