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



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


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

7
Execução que JSPerf hoje no Chrome 59.0.3071, a regex foi mais rápido em 8%
Alex McMillan


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)


5

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

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


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):


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


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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.