web-dev-qa-db-fra.com

Expression régulière pour obtenir une chaîne entre parenthèses en Javascript

J'essaie d'écrire une expression régulière qui retourne une chaîne entre parenthèses. Par exemple: je veux obtenir la chaîne qui réside entre les chaînes "(" et ")"

I expect five hundred dollars ($500).

retournerais

$500

Trouvé Expression rationnelle pour obtenir une chaîne entre deux chaînes en Javascript

Mais je suis nouveau avec regex. Je ne sais pas comment utiliser '(', ')' dans regexp

135
Okky

Vous devez créer un ensemble de parenthèses avec échappement (avec \) (qui correspondent aux parenthèses) et un groupe de parenthèses normales créant votre groupe de capture:

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

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

Panne:

  • \(: correspond à une parenthèse ouvrante
  • (: commencer la capture du groupe
  • [^)]+: correspond à un ou plusieurs caractères non )
  • ): fin du groupe de capture
  • \): faire correspondre les parenthèses fermantes

Voici une explication visuelle sur RegExplained

376
go-oleg

Essayez la manipulation de chaîne:

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 (qui est un peu lent comparé à ce qui précède)

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

Porté Réponse de Mr_Green à un style de programmation fonctionnel pour éviter l'utilisation de variables globales temporaires.

var matches = string2.split('[')
  .filter(function(v){ return v.indexOf(']') > -1})
  .map( function(value) { 
    return value.split(']')[0]
  })
7
silkAdmin

Solution simple

Notice: cette solution utilisée pour une chaîne ne comportant qu'un seul "(" et ")" comme chaîne dans cette question.

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

Démo en ligne (jsfiddle)

3
Ali Soltani

Pour les chiffres après le symbole monétaire: \(.+\s*\d+\s*\) devrait fonctionner

Ou \(.+\) pour tout ce qui est entre crochets

3
P0W

Pour faire correspondre une sous-chaîne entre parenthèses, à l’exception des parenthèses internes, vous pouvez utiliser

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

modèle. Voir la démo regex

En JavaScript, utilisez-le comme

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

Détails du motif

  • \( - un caractère (
  • ([^()]*) - Capture du groupe 1: une classe de caractères inversée correspondant à un ou plusieurs caractères autres que ( et )
  • \) - un caractère ).

Pour obtenir la correspondance complète, saisissez la valeur du groupe 0, si vous avez besoin du texte entre parenthèses, saisissez la valeur du groupe 1:

var strs = ["I expect five hundred dollars ($500).", "I expect.. :( five hundred dollars ($500)."];
var rx = /\(([^()]*)\)/g;


for (var i=0;i<strs.length;i++) {
  console.log(strs[i]);

  // Grab Group 1 values:
  var res=[], m;
  while(m=rx.exec(strs[i])) {
    res.Push(m[1]);
  }
  console.log("Group 1: ", res);

  // Grab whole values
  console.log("Whole matches: ", strs[i].match(rx));
}

2
Wiktor Stribiżew
var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/;
alert(rex.exec(str));

Correspondra au premier numéro commençant par $ et suivi de ')'. ')' ne fera pas partie du match. Le code alerte avec le premier match.

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

Ce code alerte avec toutes les correspondances.

Références:

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

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

0
AJ Dhaliwal