2011-01-09 76 views
5

Este es un ejemplo de la cadena que se está trabajando con:expresiones regulares (expresiones regulares), reemplace la segunda aparición en javascript

xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx] 

estoy teniendo un poco de problemas para adecuar a la segunda aparición de un partido, yo quiero devolver los 2 ° corchetes con un número dentro. Tengo un poco de expresiones regulares búsqueda de los primeros backets cuadrados con los números en una cadena:

\[+[0-9]+\] 

Esto devuelve [7], sin embargo quiero volver [9].

estoy usando la función de reemplazar Javascript, la siguiente expresión coincide con la segunda aparición (la [9]) en aplicaciones testeing expresiones regulares, sin embargo, no se reemplaza correctamente en el Javascript reemplazar la función:

(?:.*?(\[+[0-9]+\])){2} 

Mi pregunta es ¿cómo uso la expresión regular anterior para reemplazar el [9] en Javasctipt o hay otra expresión regular que coincida con la segunda aparición de un número entre corchetes?

¡Salud!

Respuesta

3

Si xxx es cualquier cadena, y no necesariamente un número, entonces esto podría ser lo que quiere:

(\[[0-9]+\]\[.*?\])\[([0-9]+)\] 

Esto se ve por el segundo número de []. Reemplácelo con $1[<replacement>]. Play with it on rubular.

Su expresión regular no funciona como se esperaba porque los grupos seguidos de + solamente terminan la celebración de la última [xxx].

+0

¿Por qué está usando '{3}' como un cuantificador? Esto no parece ser un "siempre habrá tres etiquetas antes de la situación que queremos, y una después", ¿no debería basar la expresión regular en los requisitos reales establecidos por el solicitante? Personalmente, usaría '/ (\ [\ d + \] (?: \ [. *? \ D. *? \]) *) (\ [\ D + \])/\ 1 [reemplazo] /' –

+0

@ Anon: No sabemos que 'xxx' no es un número. Supuse que lo era, pero tal vez estoy equivocado. – marcog

+0

He agregado otra expresión regular que reemplazará la segunda '[]'. – marcog

1

Trate

result = subject.replace(/(\[\d\]\[[^\]]+\])\[\d\]/, "$1[replace]"); 

Como una expresión regular comentado:

(  # capture the following in backref 1: 
\[\d\] # first occurrence of [digit] 
\[  # [ 
[^\]]+ # any sequence of characters except ] 
\]  # ] 
)  # end of capturing group 
\[\d\] # match the second occurence of [digit] 

Si el número de [xxx] grupos entre el primer y segundo grupo [digit] es variable, a continuación, utilizar

result = subject.replace(/(\[\d\](?:\[[^\]]+\])*?)\[\d\]/, "$1[replace]"); 

Por rodeando la parte que coincide con el [xxx] grupos con paréntesis (no-captura) y el cuantificador perezoso *? estoy pidiendo al motor de expresiones regulares para que coincida con el menor número de esos grupos como sea posible, pero tantos como sean necesarios por lo que el siguiente grupo es un grupo [digit].

0
console.log("xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx]".replace(
/^(.*\[[0-9]+\].*)(\[[0-9]+\])(.*)$/, 
'$1[15]$3')); // replace with matches before ($1) and after ($3) your match ($2) 

devuelve:

// xxxxxx[xxxxxx][7][xxxxxx][15][xxxxxx] 

que coincidirá donde [n] está precedido por 1 conjunto de soportes con números dentro.

+0

No estoy seguro de si esto es importante, pero esto falla en [1] [2] [3] - reemplaza al último [3]. Quizás el OP debería proporcionar algunas pruebas ... – Hemlock