Expresión regular para obtener una cadena entre paréntesis en Javascript

178

Estoy tratando de escribir una expresión regular que devuelve una cadena que está entre paréntesis. Por ejemplo: quiero obtener la cadena que reside entre las cadenas "(" y ")"

I expect five hundred dollars ($500).

volvería

$500

Se encontró expresión regular para obtener una cadena entre dos cadenas en Javascript

Pero soy nuevo con regex. No sé cómo usar '(', ')' en regexp

Okky
fuente
puede usar la solución de go-oleg a continuación, ligeramente modificada para probar el signo del dólar:var regExp = /\(\$([^)]+)\)/;
Dom Day

Respuestas:

461

Debe crear un conjunto de \paréntesis escapados (con ) (que coincidan con los paréntesis) y un grupo de paréntesis regulares que creen su grupo de captura:

var regExp = /\(([^)]+)\)/;
var matches = regExp.exec("I expect five hundred dollars ($500).");

//matches[1] contains the value between the parentheses
console.log(matches[1]);

Descompostura:

  • \( : coincide con un paréntesis de apertura
  • ( : comenzar a capturar el grupo
  • [^)]+: coincide con uno o más )caracteres no
  • ) : finalizar grupo de captura
  • \) : paréntesis de cierre

Aquí hay una explicación visual sobre RegExplained

go-oleg
fuente
12
+1 Bonito, funcionó a las mil maravillas. Me gustaría agregarlo para agregar este tinyurl.com/mog7lr3 en su para una explicación visual.
Praveen
55
@ user1671639: actualizado. Gracias por el enlace!
go-oleg
55
Esto no funciona si hay paréntesis dentro de los paréntesis que desea capturar. Tales como: "Espero quinientos dólares ($ 500 (pero sé que nunca volveré a ver ese dinero))".
JayB
1
Esta expresión regular solo funciona si coincide una instancia por picadura. Usar la /gbandera global no funcionará como se esperaba.
silkAdmin
2
¿Cuál es la solución si tiene varias cadenas dentro de paréntesis como a continuación: "Espero (quinientos) dólares ($ 500)" digamos que quiero una serie de esas cadenas especiales.
Mohamad Al Asmar
33

Prueba la manipulación de cadenas:

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var newTxt = txt.split('(');
for (var i = 1; i < newTxt.length; i++) {
    console.log(newTxt[i].split(')')[0]);
}

o regex ( que es algo lento en comparación con lo anterior )

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var regExp = /\(([^)]+)\)/g;
var matches = txt.match(regExp);
for (var i = 0; i < matches.length; i++) {
    var str = matches[i];
    console.log(str.substring(1, str.length - 1));
}
SR verde
fuente
77
Al ejecutar ese jsperf hoy en Chrome 59.0.3071, la expresión regular fue más rápida en un 8%
Alex McMillan
9

Portado respuesta de Mr_Green a un estilo de programación funcional para evitar el uso de variables globales temporales.

var matches = string2.split('[')
  .filter(function(v){ return v.indexOf(']') > -1})
  .map( function(value) { 
    return value.split(']')[0]
  })
sedaadmin
fuente
Lo que estaba buscando stackoverflow.com/questions/49614116/…
wobsoriano
8

Solución simple

Aviso : esta solución se puede usar para cadenas que tienen solo una sola cadena "(" y ")" en esta pregunta.

("I expect five hundred dollars ($500).").match(/\((.*)\)/).pop();

Demostración en línea (jsfiddle)

Ali Soltani
fuente
5

Solo para dígitos después de un signo de moneda: \(.+\s*\d+\s*\) debería funcionar

O \(.+\)para cualquier cosa entre corchetes

P0W
fuente
2
Esto funcionará para el texto de muestra, sin embargo, si )aparece otro más adelante en la cadena, como I expect five hundred dollars ($500). (but I'm going to pay).la codicia del +capturará mucho más.
Ro Yo Mi
@Denomales Entonces, ¿cómo haría que capturara ambas instancias de esas cadenas? Idealmente, estoy haciendo algo similar, pero me gustaría tener: ¿ ($500)y (but I'm going to pay) ser emparejado pero en dos partidos separados en lugar de ser considerado un solo elemento emparejado? ¡Gracias por adelantado!
Tom Bird
(. +) trabajó para mi requerimiento. Necesario para capturar cosas como "Dunhill (Botella / Paquete / Olla / Shot)" y regresar solo "Dunhill"
GentleGiant
5

Para hacer coincidir una subcadena entre paréntesis, excluyendo cualquier paréntesis interno, puede usar

\(([^()]*)\)

patrón. Vea la demostración de expresiones regulares .

En JavaScript, úsalo como

var rx = /\(([^()]*)\)/g;

Detalles del patrón

Para obtener la coincidencia completa, tome el valor del Grupo 0, si necesita el texto entre paréntesis, tome el valor del Grupo 1.

Demostración de código JavaScript más actualizada (usando matchAll):

const strs = ["I expect five hundred dollars ($500).", "I expect.. :( five hundred dollars ($500)."];
const rx = /\(([^()]*)\)/g;
strs.forEach(x => {
  const matches = [...x.matchAll(rx)];
  console.log( Array.from(matches, m => m[0]) ); // All full match values
  console.log( Array.from(matches, m => m[1]) ); // All Group 1 values
});

Demostración de código JavaScript heredado (compatible con ES5):

Wiktor Stribiżew
fuente
Esta expresión regular es excelente porque solo captura pares ()y sus contenidos, incluso cuando están uno al lado del otro ()().
limitlessloop
1
@limitlessloop Dado que esto parece una respuesta útil, también agregué una nueva matchAlldemostración de código JavaScript.
Wiktor Stribiżew
3

let str = "Before brackets (Inside brackets) After brackets".replace(/.*\(|\).*/g, '');
console.log(str) // Inside brackets

Y corrió
fuente
2

Alternativa:

var str = "I expect five hundred dollars ($500) ($1).";
str.match(/\(.*?\)/g).map(x => x.replace(/[()]/g, ""));
 (2) ["$500", "$1"]

Es posible reemplazar los corchetes con corchetes o cuadrados si es necesario

marcofriso
fuente
1
var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/;
alert(rex.exec(str));

Coincidirá con el primer número que comienza con $ y seguido de ')'. ')' no será parte del partido. El código alerta con el primer partido.

var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/g;
var matches = str.match(rex);
for (var i = 0; i < matches.length; i++)
{
    alert(matches[i]);
}

Este código alerta con todos los partidos.

Referencias

busque "? = n" http://www.w3schools.com/jsref/jsref_obj_regexp.asp

busque "x (? = y)" https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp

AJ Dhaliwal
fuente