2011-11-23 12 views
6

Si me quedo esto:¿Cómo puedo obtener una expresión regular para encontrar todas las coincidencias en javascript?

'121'.match(/[0-9]{2}/gi) 

regrese una matriz con un solo resultado:

['12'] 

¿Cómo puedo conseguir que devolver todos los resultados, incluso si se solapan? Quiero que el resultado sea esto:

['12', '21'] 

EDIT: O un mejor ejemplo sería:

'1234567'.match(...); 

me diera una matriz con

[12, 23, 34, 45, 56, 67]

+0

Cuál es la pregunta? –

+1

Estoy tratando de sacar tanto '12' como '21' de esa cuerda, en vez de eso solo obtengo '12' porque el motor de expresiones regulares se detiene después de encontrar una coincidencia. – Nick

Respuesta

4

esto simplemente no funcionará en la forma que desee.

cuando especifica el patrón [0-9]{2}, busca la primera aparición de un número de dos dígitos, luego continúa la búsqueda desde ese lugar. como la longitud de la cuerda es 3, obviamente no encontrará otra coincidencia.

debe usar un algoritmo diferente para encontrar todos los números de dos dígitos. Sugiero usar la combinación de tu primera coincidencia y hacer una más con la siguiente regex

/[0-9]([0-9]{2})/ y combinar conjuntos de primera y segunda ejecución.

1

No es muy concisa, pero esto:

var matches = []; 
'1234567'.replace 
(
    /(?=[0-9]{2})/gi, 
    function(s,pos,str) 
    { 
    matches.push(str.substr(pos, 2)); 
    } 
); 

establecerá matches-['12','23','34','45','56','67']. Funciona mediante el uso de una afirmación de búsqueda anticipada para encontrar coincidencias sin realmente tragarlas. (El replace en realidad no reemplace nada en este caso, es sólo una manera conveniente de aplicar un cierre a todas las instancias de una expresión regular-coincidencia en una cadena dada.)

3

Usted puede hacerlo de esta manera:

var str = '121'; 
var results = []; 
var re = /[0-9]{2}/gi, matches; 
while (matches = re.exec(str)) { 
    results.push(matches[0]); 
    re.lastIndex -= (matches[0].length - 1); // one past where it matched before 
} 
// results is an array of matches here 

Toma múltiples llamadas a .exec() y luego tiene que manipular el valor .lastIndex para que comience donde desea que se vea de nuevo.

Puedes verlo trabajar aquí: http://jsfiddle.net/jfriend00/XsNe5/.

Puede leer sobre cómo llamar varias veces al .exec() aquí: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/exec.

1

Aquí es otro ejemplo usando los símbolos de anticipación

var str = "12345", 
    regexp = /\d(?=(\d))/g, 
    results = [], 
    m = null; 

while(m = regexp.exec(str)) results.push(m.join('')); 

alert(results) // 12,23,34,45 

misma idea que ruakh, pero un enfoque ligeramente diferente.

6

Esto funciona con la mayoría de los motores pcre.
Captura 2, consume 1.

/(?=(\d\d))\d/g

Soy nuevo en javascript. Esto funciona:

var pat = /(?=(\d\d))\d/g; 
var results = []; 
var match; 

while ((match = pat.exec('1234567')) != null) { 
    results.push(match[1]); 
} 

print (results); 

Salida: 12,23,34,45,56,67

Cuestiones relacionadas