2010-07-25 6 views
5

Digamos que tengo una cadena larga de texto, y quiero capturar cada vez que se menciona la palabra this dentro de los corchetes redondeados. ¿Cómo podría hacer eso? El siguiente patrón sólo coincide con la primera this, ignorando todas las apariciones después de:Regex captura cada aparición de una palabra dentro de dos delimitadores

/\(.*(this).*\)/g 

Por ejemplo, usando el modelo anterior en el siguiente texto:

Etiam scelerisque, consequat ac nunc egestas, (odio este nibh euismod nulla, eget auctor orci nibh vel este nisi. Aliquam este erat volutpat).

Solo devolverá la primera this después de la palabra odio.

¿Qué estoy haciendo mal?

+0

a su valor nominal, no veo nada de malo en ese patrón ... publicar el código que se esté utilizando, –

+0

Ok, entonces hay 3 "esto" en su texto de muestra. Entonces, ¿cuál es el resultado esperado? ¿Desea contar el número de "esto" en esos paréntesis? ¿O solo quieres devolver lo que hay entre esos paréntesis? describa claramente lo que quiere como salida – ghostdog74

+0

+1 propter uti lingua latina. :) – danlei

Respuesta

6

En primer lugar, no seas codicioso.

/\(.*?(this).*?\)/g

En segundo lugar, si usted está apuntando para contar el número de ocurrencias de 'esto', una expresión regular no es probablemente la herramienta aquí. El problema es que debe coincidir con el delimitador de cierre para determinar que el primer 'this' está encerrado, lo que significa que continuar aplicando la expresión regular no coincidirá con nada dentro del conjunto de delimitadores ya consumido.

La expresión regular que tengo encima cogerá cosas como:

foo (baz this bar) (foo this)

Pero no (sólo coincidirá dos veces, una para cada conjunto de delimitadores):

foo (this this bar) baz (this this this)

Try usando un escáner simple de un solo paso en lugar de una expresión regular. Otra alternativa es usar dos expresiones regulares, una para separar la cadena en secciones cerradas y no encerradas, y otra para buscar dentro de las regiones adjuntas.

1

el uso de .* va a coincidir con cada carácter de la cadena de búsqueda. Entonces, lo que en realidad estás haciendo acá es igualar todo antes y después de la primera aparición de this entre paréntesis. los resultados de los partidos actuales probablemente se ven un poco como los siguientes:

["(odio this nibh euismod nulla, eget auctor orci nibh vel this nisi. Aliquam this erat volutpat)", "this"] 

Cuando el primer elemento de la matriz es toda la subcadena encontrada por la expresión, y todo lo que sigue son valores capturados de su expresiones regulares.

Si desea hacer coincidir todas las apariciones de this dentro de los paréntesis, una solución sería la de obtener primero una subcadena de todo dentro de los paréntesis, a continuación, buscar this en esa subcadena:

# Match everything inside the parentheses 
/\([^\)]*\)/ 

# Match all occurrences of the word 'this' inside a substring 
/this/g 
0

he implementado el regex para encerrar todos los caracteres alfanuméricos usando regex a continuación:

# cat testfile 
aabc a1 +++ xyz 20 30 =40 -r 
# cat testfile | sed -e "s/\([[:alnum:]]\{1,\}\)/<pre>\1<post>/g" 
<pre>aabc<post> <pre>a1<post> +++ <pre>xyz<post> <pre>20<post> <pre>30<post> =<pre>40<post> -<pre>r<post> 
# 

Espero que ayude.

Cuestiones relacionadas