Expressão regular para obter uma string entre parênteses em Javascript

177

Eu estou tentando escrever uma expressão regular que retorna uma seqüência de caracteres entre parênteses. Por exemplo: quero obter a string que reside entre as strings "(" e ")"

I expect five hundred dollars ($500).

retornaria

$500

Expressão regular encontrada para obter uma string entre duas strings em Javascript

Mas eu sou novo com regex. Não sei como usar '(', ')' no regexp

Okky
fonte
você pode usar a solução da go-oleg abaixo, ligeiramente modificada para testar o cifrão:var regExp = /\(\$([^)]+)\)/;
Dom Day

Respostas:

460

Você precisa criar um conjunto de \parênteses de escape (com ) (que correspondem aos parênteses) e um grupo de parênteses regulares que criam seu 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]);

Demolir:

  • \( : coincide com parênteses de abertura
  • ( : começa a capturar o grupo
  • [^)]+: corresponde a um ou mais )caracteres não
  • ) : grupo final de captura
  • \) : coincidir com parênteses de fechamento

Aqui está uma explicação visual sobre o RegExplained

go-oleg
fonte
12
+1 Bom, funcionou como um encanto. Gostaria de adicionar você para adicionar este tinyurl.com/mog7lr3 no seu para uma explicação visual.
precisa saber é o seguinte
5
@ user1671639: Atualizado. Obrigado pelo link!
go-oleg 26/09/13
5
Isso não funciona se houver parênteses dentro dos parênteses que você deseja capturar. Tais como: "Espero quinhentos dólares (US $ 500 (mas sei que nunca mais voltarei a ver esse dinheiro))."
21715 JayB
1
Essa regex funciona apenas se corresponder a uma instância por picada. Usar a /gbandeira global não funcionará conforme o esperado.
silkAdmin
2
qual é a solução se você tiver várias cadeias entre parênteses como abaixo: "Espero (quinhentos) dólares ($ 500)", digamos que eu queira uma matriz dessas cadeias especiais.
Mohamad Al Asmar
33

Tente manipulação de string:

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]);
}

ou regex ( que é um pouco lento em comparação com o acima )

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));
}
Senhor Verde
fonte
7
Execução que JSPerf hoje no Chrome 59.0.3071, a regex foi mais rápido em 8%
Alex McMillan
9

Portado resposta de Mr_Green a um estilo de programação funcional para evitar o uso de variáveis globais temporários.

var matches = string2.split('[')
  .filter(function(v){ return v.indexOf(']') > -1})
  .map( function(value) { 
    return value.split(']')[0]
  })
silkAdmin
fonte
O que eu estava procurando. stackoverflow.com/questions/49614116/…
wobsoriano
8

Solução simples

Nota : esta solução pode ser usada para strings que possuem apenas "(" e ")" strings únicos nesta questão.

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

Demonstração online (jsfiddle)

Ali Soltani
fonte
5

Por apenas dígitos após um sinal de moeda: \(.+\s*\d+\s*\)deve funcionar

Ou \(.+\)para qualquer coisa entre parênteses

P0W
fonte
2
Isso funcionará para o texto de exemplo, no entanto, se outro )aparecer mais tarde na sequência, como I expect five hundred dollars ($500). (but I'm going to pay).a ganância do +capturará muito mais.
Ro Yo Mi
@ Denomales Então, como você deseja capturar as duas instâncias dessas strings. Idealmente, estou fazendo algo semelhante, mas gostaria de ter: ($500)e (but I'm going to pay) ser correspondido, mas em duas partidas separadas, em vez de ser considerado um único item correspondente? Desde já, obrigado!
Tom Pássaro
(. +) trabalhou para minha exigência. Necessário para animais de captura como "Dunhill (Bottle / Packet / Pot / Shot)" e retornar apenas "Dunhill"
gentlegiant
5

Para corresponder uma substring entre parênteses, excluindo os parênteses internos, você pode usar

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

padronizar. Veja a demonstração do regex .

Em JavaScript, use-o como

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

Detalhes do padrão

Para obter toda a correspondência, pegue o valor do Grupo 0, se precisar do texto entre parênteses, pegue o valor do Grupo 1.

Demonstração de código JavaScript mais atualizada (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
});

Demonstração de código JavaScript herdado (compatível com ES5):

Wiktor Stribiżew
fonte
Essa regex é ótima porque captura apenas pares ()e seu conteúdo, mesmo quando lado a lado ()().
limitlessloop
1
@limitlessloop Como essa resposta parece útil, eu também adicionei uma nova matchAlldemonstração de código JavaScript baseada.
Wiktor Stribiżew
3

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

E correu
fonte
2

Alternativo:

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

É possível substituir os suportes por quadrados ou cacheados, se você precisar

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

Corresponderá ao primeiro número começando com $ e seguido por ')'. ')' não fará parte da partida. O código alerta com a primeira correspondência.

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 com todas as correspondências.

Referências:

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

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

AJ Dhaliwal
fonte