2010-10-19 10 views
5

¿cómo puedo decir, en las expresiones regulares:Ayuda con expresión regular - Sin adición de un poco de cuerda

Cualquier porción de una cadena que comienza con una letra mayúscula, que contiene al menos un carácter de espacio, no contiene la cadena
" _ " (space underscore space), y terminando con la cadena "!!!" (sin las comillas)?

Tengo problemas con la parte "que no contiene".

Esto es lo que tengo hasta ahora:

[A-Z].* .*!!! 

¿Cómo modifico esta opción para especificar también "Que no contengan '_'"?

No es necesario que sea la cadena específica "_". ¿Cómo puedo decir "que no contiene" CUALQUIER cadena? Por ejemplo, no contiene "perro"?

Edición: Me gustaría que la solución sea compatible con "preg_replace" de PHP

Edición: Ejemplos:

Ejemplos para "_":

Abc XYZ !!! < --- Coincidencias

¡Hola mundo! < --- Partidos

Tiene _ Space Underscore Space !!! < --- no coincide

Ejemplos de "perro":

Lo que un perro !!! < --- No coincide, (contiene "perro")

Hello World !!! < --- Coincidencias

+4

Hola, ¿qué idioma está usando? Perl Reg.exps? ECMAScript? – Benoit

+0

¿Puedes publicar algunos ejemplos de cadenas válidas/inválidas? – Kobi

Respuesta

2

x(?!y) La expresión coincide con x sólo si no es seguida inmediatamente por y. Por lo tanto, esto parece ser lo que desea:

[A-Z](?!%s)(.(?!%s))* (.(?!%s))*!!! 

Dónde %s es su cadena prohibido.

1

Cualquier posible expresión regular para esto sería probablemente mucho más complicado que dos expresiones regulares. Uno como el suyo: [A-Z].* .*!!! y el segundo aplicado en cadenas coincidentes y verificando si _ está contenido.

+0

Desafortunadamente, necesito "capturar" la parte coincidente de la cadena, por lo que necesito una sola expresión regular para ella. – Joshua

0

Comience con Cualquier capital; tener una cadena opcional de todo, excepto un guión bajo, un espacio, y luego todo, excepto subrayar, seguido de tres signos de admiración.

[A-Z][^_]*[ ][^_]*!!! 
+0

No coincidirá con 'Abc_d ef !!!' – Benoit

+0

¿Cómo podría aplicar esto en el caso del ejemplo "perro", en mi edición anterior? – Joshua

0

Primera prueba de su cadena por cualquiera ocurrencia de "_", ya que es un no partido. Luego verifica lo que quieras.

Eso es lo que haría en lugar de perder mucho tiempo tratando de encontrar una expresión regular para ello.

Aquí es un buen sitio para probar sus expresiones: Nregex

Editar: Me leer un poco más sobre su pregunta y ver que mi respuesta no fue muy buena, así que aquí tiene otro intento. Una modificación de una de las expresiones anteriores:

[A-Z](?! _)(\w(?! _))* (\w(?! _))*!!! 
0
[A-Z]([^ ]*(?! _) ?)*!!! 

Editar: no vi a su requisito de al menos un espacio. La expresión regular a continuación incluye ese requisito:

[A-Z][^ ]* (?!_)((?! _).)*!!! 
0

que utiliza para resolverlo a través de la opción grep 's -v (si estoy en Linux y/o puedo usar grep).

Así que busque algo, luego omita las partes poco interesantes.

grep something <INPUT> | grep -v uninteresting 

Sin grep (maldito ventanas, sin derechos de administrador) pero con Vim:

vim -c "v/i'm searching for this/d" -c "g/and don't need this/d" -c "w checkoutput" <INPUT> 

(Esto abre, a continuación, elimina todas las líneas de lo que no coincide con lo que necesita, a continuación, elimina todas las líneas, lo que no necesita, a continuación, guardar los resultados como checkoutput. lo que usted debe comprobar.)

HTH

Cuestiones relacionadas