2008-09-04 10 views
83

He visto muchos ejemplos de hacer que una expresión regular completa no distinga entre mayúsculas y minúsculas. Lo que me pregunto es que solo parte de la expresión sea insensible a mayúsculas y minúsculas.¿Puedes hacer solo parte de una expresión regular sin distinguir entre mayúsculas y minúsculas?

Por ejemplo, digamos que tengo una cadena como esta:

fooFOOfOoFoOBARBARbarbarbAr 

Qué pasa si quiero hacer coincidir todas las apariciones de "foo", independientemente del caso, pero sólo quiero que coincida con la mayúscula "BAR s?

La solución ideal sería algo que funciona a través de los sabores de expresiones regulares, pero estoy interesado en los específicos del idioma de audición, así (Gracias Espo)

Edición

El enlace fue proporcionada Espo muy útil. Hay un buen ejemplo de activar y desactivar modificadores dentro de la expresión.

Para mi ejemplo artificial, que puede hacer algo como esto:

(?i)foo*(?-i)|BAR 

lo que hace que el caso insensible por sólo la parte foo del partido partido.

Eso pareció funcionar en la mayoría de las implementaciones de expresiones regulares excepto JavaScript, Python y algunas otras (como mencionó Espo).

Las grandes que me preguntaba (Perl, PHP, .NET) admiten cambios en el modo en línea.

+0

Esta pregunta ha sido añadida a la [desbordamiento de pila FAQ expresión regular] (http://stackoverflow.com/a/22944075/2736496), en "Modificadores". – aliteralmind

Respuesta

77

Perl le permite hacer que parte de su expresión regular no distinga entre mayúsculas y minúsculas al usar el modificador de patrón (? I :).

Los sabores regex modernos le permiten aplicar modificadores a solo una parte de la expresión regular. Si inserta el modificador (? Ismo) en el medio de la expresión regular, el modificador solo se aplica a la parte de la expresión regular a la derecha del modificador. Puede desactivar los modos precediéndolos con un signo menos. Todos los modos después del signo menos se apagarán. P.ej. (? i-sm) activa la insensibilidad de mayúsculas y apaga tanto el modo de línea única como el modo multilíneas.

No todos los sabores regex admiten esto. JavaScript y Python aplican todos los modificadores de modo a la expresión regular completa. No admiten la sintaxis (? -ismx), ya que desactivar una opción no tiene sentido cuando los modificadores de modo se aplican a todas las expresiones regulares. Todas las opciones están desactivadas por defecto.

Puede probar rápidamente cómo el sabor de la expresión regular que está utilizando maneja los modificadores de modo. La expresión regular (? I) te (? - i) st debe coincidir con la prueba y el TEst, pero no con la prueba o prueba.

Source

+0

funciona en hg/mercurial. ¡increíble! – RubyTuesdayDONO

4

Usted podría utilizar

(?:F|f)(?:O|o)(?:O|o) 

El:? En los soportes en .Net significa que es no-captura, y sólo se utiliza para agrupar los términos de la | (o) declaración.

+24

no es "[FF] [oO] [oO]" la mejor alternativa? Para el ejemplo que tenemos a mano, incluso puedes ir tan lejos como "[fF] [oO] \ {2}" ;-) – Tomalak

5

¿Qué idioma estás usando? Una forma estándar de hacer esto sería algo como/([Ff] [Oo] {2} | BAR)/con mayúsculas y minúsculas activada, pero en Java, por ejemplo, hay un modificador de sensibilidad de mayúsculas y minúsculas (?i) que hace que todos los caracteres a la derecha del mismo sensible a mayúsculas y (? -i) que obliga a la sensibilidad. Un ejemplo de ese modificador de expresiones regulares Java se puede encontrar here.

+0

+1 ¿Por qué molestarse en que sea insensible a mayúsculas y minúsculas cuando se pueden combinar ambos casos? –

+5

@NonaUrbiz: Porque la expresión ' (? i) foobar' es más legible que '[FF] [Oo] {2} [Bb] [AA] [Rr]' – Thanatos

+0

y debido a que puede crecer mucho más _manera_ cabelludo y compleja. – Chop

6

Desafortunadamente sintaxis de coincidencia de mayúsculas y minúsculas no es común. En .NET se puede utilizar el indicador de RegexOptions.IgnoreCase o ? I modificador

Cuestiones relacionadas