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



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


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

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


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)


5

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

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


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


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


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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.