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

178

J'essaie d'écrire une expression régulière qui renvoie 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

Expression régulière trouvée pour obtenir une chaîne entre deux chaînes en Javascript

Mais je suis nouveau avec regex. Je ne sais pas comment utiliser '(', ')' dans une expression régulière

Okky
la source
vous pouvez utiliser la solution de go-oleg ci-dessous, légèrement modifiée pour tester le signe dollar:var regExp = /\(\$([^)]+)\)/;
Dom Day

Réponses:

461

Vous devez créer un ensemble de \parenthèses échappées (avec ) (qui correspondent aux parenthèses) et un groupe de parenthèses régulières qui créent 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

go-oleg
la source
12
+1 Nice, a fonctionné comme un charme. Je voudrais vous ajouter pour ajouter ce tinyurl.com/mog7lr3 dans votre pour une explication visuelle.
Praveen le
5
@ user1671639: mis à jour. Merci pour le lien!
go-oleg
5
Cela ne fonctionne pas s'il y a des parenthèses entre les parenthèses que vous souhaitez capturer. Tels que: "Je m'attends à cinq cents dollars (500 $ (mais je sais que je ne reverrai jamais cet argent))."
JayB
1
Cette expression régulière ne fonctionne que si elle correspond à une instance par piqûre. L'utilisation de l' /gindicateur global ne fonctionnera pas comme prévu.
silkAdmin déc.26
2
quelle est la solution si vous avez plusieurs chaînes entre parenthèses comme ci-dessous: "J'attends (cinq) cent dollars (500 $)" disons que je veux un tableau de ces chaînes spéciales.
Mohamad Al Asmar
33

Essayez la manipulation de chaînes:

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 ( ce qui est un peu lent par rapport à 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));
}
Monsieur green
la source
7
En exécutant ce jsperf aujourd'hui dans Chrome 59.0.3071, l'expression régulière était plus rapide de 8%
Alex McMillan
9

Ported réponse de Mr_Green à un style de programmation fonctionnelle 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]
  })
soieAdmin
la source
Ce que je cherchais. stackoverflow.com/questions/49614116/…
wobsoriano
8

Solution simple

Remarque : cette solution peut être utilisée pour les chaînes n'ayant qu'un seul "(" et ")" comme chaîne dans cette question.

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

Démo en ligne (jsfiddle)

Ali Soltani
la source
5

Pour juste des chiffres après un signe de devise: \(.+\s*\d+\s*\)devrait fonctionner

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

P0W
la source
2
Cela fonctionnera pour l'exemple de texte, mais si un autre )apparaît plus tard dans la chaîne, comme I expect five hundred dollars ($500). (but I'm going to pay).la gourmandise du +, en capturera beaucoup plus.
Ro Yo Mi
@Denomales Alors, comment voulez-vous qu'il capture les deux instances de ces chaînes. Idéalement, je fais quelque chose de similaire, mais j'aimerais avoir: ($500)et (but I'm going to pay) être mis en correspondance mais en deux matchs séparés plutôt que d'être considéré comme un seul élément correspondant? Merci d'avance!
Tom Bird
(. +) a travaillé pour mon exigence. Nécessaire pour capturer des trucs comme "Dunhill (Bottle / Packet / Pot / Shot)" et renvoyer juste "Dunhill"
GentleGiant
5

Pour faire correspondre une sous-chaîne entre parenthèses en excluant les parenthèses internes que vous pouvez utiliser

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

modèle. Voir la démo regex .

En JavaScript, utilisez-le comme

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

Détails du motif

  • \(- un (omble chevalier
  • ([^()]*)- Groupe de capture 1: une classe de caractères annulée correspondant à 0 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.

Démonstration de code JavaScript la plus à jour (en utilisant 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
});

Démonstration du code JavaScript hérité (compatible ES5):

Wiktor Stribiżew
la source
Cette expression régulière est géniale car elle ne capture que les paires de ()et leur contenu, même côte à côte ()().
limitlessloop
1
@limitlessloop Puisque cela semble une réponse utile, j'ai également ajouté une nouvelle matchAlldémo de code JavaScript basée.
Wiktor Stribiżew
3

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

Andran
la source
2

Alternative:

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

Il est possible de remplacer les crochets par des crochets carrés ou bouclés si vous avez besoin

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

Correspondra au premier nombre commençant par un $ et suivi de ')'. ')' ne fera pas partie du match. Le code alerte avec la première correspondance.

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:

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

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

AJ Dhaliwal
la source