2011-06-01 33 views
31

Estoy teniendo un momento difícil para hacer que esto funcione. Tengo una cadena como:RegEx para hacer coincidir cosas entre paréntesis

something/([0-9])/([a-z]) 

Y necesito expresiones regulares o un método para obtener cada partido entre los paréntesis, y devolver una matriz de coincidencias como:

[ 
    [0-9], 
    [a-z] 
] 

La expresión regular que estoy usando es /\((.+)\)/ que parece coincidir con lo correcto si solo hay uno conjunto de paréntesis.

¿Cómo puedo obtener una matriz como la anterior usando cualquier método RegExp en JavaScript? Necesito devolver solo esa matriz porque devolvió elementos en la matriz se crearán un bucle para crear un esquema de enrutamiento de URL.

+1

Cuando se dice "un conjunto de paréntesis", son usted refiriéndose a paréntesis * anidados *? Básicamente está más allá del poder de las expresiones regulares entender todo el asunto de los "paréntesis equilibrados". – Pointy

+0

_Anything_ dentro de '()'. Entonces, si la cadena fuera 'something/([0-9])/((a) (b))' devolvería '[[0-9], (a) (b)]'. No los voy a validar, solo lanzándolos dentro de un 'nuevo RegExp()' –

Respuesta

71

Necesita convertir su patrón de expresiones regex no codiciosas agregando un '?' después del '. +'

De manera predeterminada, '*' y '+' son codiciosos ya que coincidirán con una cadena de caracteres lo más larga posible, ignorando cualquier coincidencia que pueda ocurrir dentro de la cadena.

No codicioso hace que el patrón solo coincida con la menor coincidencia posible.

Consulte Watch Out for The Greediness! para una mejor explicación.

O, alternativamente, cambiar su expresión regular para

\(([^\)]+)\) 

que coincidirá con cualquier agrupación de parens que no lo hacen, ellos mismos, contienen parens.

+0

Perfecto, ¡eso lo iguala! pero estoy atascado en cómo hacer una selección de eso? Acabo de recibir '[" ([0-9]) "]' con 'str.match (/ \ ([^ \)] + \)/g)' :( –

+2

Te estás perdiendo la captura interna de inicio y finalización parens. Pruebe/\\ (([^)] +) \\)/g que capturará todos los valores entre paréntesis posibles. Tenga en cuenta el * segundo * par de parens después de \\ (y antes de \\). –

+0

¡Perfecto gracias! –

4

uso esta expresión:

/\(([^()]+)\)/g 

por ejemplo:

function() 
{ 
    var mts = "something/([0-9])/([a-z])".match(/\(([^()]+)\)/g); 
    alert(mts[0]); 
    alert(mts[1]); 
} 
3
var getMatchingGroups = function(s) { 
    var r=/\((.*?)\)/g, a=[], m; 
    while (m = r.exec(s)) { 
    a.push(m[1]); 
    } 
    return a; 
}; 

getMatchingGroups("something/([0-9])/([a-z])"); // => ["[0-9]", "[a-z]"] 
2

Si s es la cadena:

s.replace(/^[^(]*\(/, "") // trim everything before first parenthesis 
.replace(/\)[^(]*$/, "") // trim everything after last parenthesis 
.split(/\)[^(]*\(/);  // split between parenthesis 
Cuestiones relacionadas