2011-03-26 7 views
9

Si uso string.match() con una expresión regular, recuperaré la cadena coincidente, pero no el índice en la cadena original donde ocurre la coincidencia. Si hago string.search(), obtengo el índice, pero no necesariamente sé cuánto tiempo coincide la parte correspondiente de la cadena. ¿Hay alguna manera de hacer ambas cosas, así que puedo obtener el índice final del partido en la cadena original?buscar el índice final de una expresión regular búsqueda/coincidencia

Supongo que podría hacer una después de la otra (abajo), suponiendo que devuelvan los mismos resultados pero de una manera diferente, pero eso parece feo e ineficiente, y sospecho que hay una mejor manera.

var str = "Fear leads to anger. Anger leads to hate. Hate leads to suffering"; 

var rgx = /l[aeiou]+d/i; 
var match = str.match(rgx); 
if (match && match[0]) { 
    var i = str.search(rgx); 
    console.log ("end of match is at index " + (i+match[0].length)); 
    } 

Respuesta

10

.match devuelve una nueva matriz con las siguientes propiedades:

propiedad

El índice se encuentra en la posición de la subcadena coincidente dentro de la cadena completa S.

La entrada la propiedad se establece en S.

La propiedad de longitud se establece en n +1.

El 0 propiedad se establece en el emparejado subcadena (i. E. La parte de S entre compensado i inclusivo y compensado e exclusivo).

Para cada número entero i tal que i> 0 e i < = n, establezca la propiedad llamada ToString (i) en el elemento i de la matriz de capturas de r.

De http://bclary.com/2004/11/07/#a-15.10.6.2

match.index proporcionará lo que necesita.

+0

interesante ... Me di cuenta de que Chrome pone el índice en la matriz (suponiendo que no tenga una/g ... por lo que habría múltiples coincidencias y no tendría sentido tener un solo índice) . Si esto es compatible con todos los navegadores razonables (...?), Eso es perfecto. – rob

0

Alternativamente:

if (match && match[0]) { 
    console.log ("end of match is at index " + (str.indexOf(match[0]) + match[0].length)); 
} 
+1

Supongo que tienes razón, que si haces un indexOf en coincidencia [0] siempre será la primera ocurrencia. A menos que haya una expresión regular extraña que podría, digamos, darte la segunda ocurrencia de una cuerda ... – rob

Cuestiones relacionadas