Espressione regolare per ottenere una stringa tra parentesi in Javascript


178

Sto cercando di scrivere un'espressione regolare che restituisca una stringa tra parentesi. Ad esempio: voglio ottenere la stringa che risiede tra le stringhe "(" e ")"

I expect five hundred dollars ($500).

sarebbe tornato

$500

Trovato espressione regolare per ottenere una stringa tra due stringhe in Javascript

Ma sono nuovo con regex. Non so come usare '(', ')' in regexp



puoi usare la soluzione di go-oleg qui sotto, leggermente modificata per testare il simbolo del dollaro:var regExp = /\(\$([^)]+)\)/;
Dom Day

Risposte:


461

Devi creare un set di \parentesi con escape (con ) (che corrispondono alle parentesi) e un gruppo di parentesi regolari che creano il tuo gruppo di acquisizione:

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

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

Abbattersi:

  • \( : corrisponde a una parentesi aperta
  • ( : inizia a catturare il gruppo
  • [^)]+: abbina uno o più non )caratteri
  • ) : fine gruppo di acquisizione
  • \) : abbina parentesi chiuse

Ecco una spiegazione visiva su RegExplained


12
+1 Bello, ha funzionato come un fascino. Vorrei aggiungerti per aggiungere questo tinyurl.com/mog7lr3 nel tuo per una spiegazione visiva.
Praveen,

5
@ user1671639: aggiornato. Grazie per il link!
go-oleg,

5
Questo non funziona se ci sono parentesi tra parentesi che vuoi catturare. Ad esempio: "Mi aspetto cinquecento dollari ($ 500 (ma so che non vedrò mai più quei soldi))."
JayB,

1
Questa regex funziona solo se corrisponde a un'istanza per puntura. L'uso della /gbandiera globale non funzionerà come previsto.
silkAdmin,

2
qual è la soluzione se hai più stringhe tra parentesi come sotto: "Mi aspetto (cinquecento) cento dollari ($ 500)" diciamo che voglio un array di quelle stringhe speciali.
Mohamad Al Asmar,

33

Prova la manipolazione delle stringhe:

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

o regex ( che è un po ' lento rispetto a quanto sopra )

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
Eseguendo quel jsperf oggi su Chrome 59.0.3071, la regex è stata più veloce dell'8%
Alex McMillan,


8

Soluzione semplice

Nota : questa soluzione può essere utilizzata per le stringhe che contengono solo una stringa "(" e ")" come questa domanda.

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

Demo online (jsfiddle)


5

Per solo cifre dopo un segno di valuta: \(.+\s*\d+\s*\)dovrebbe funzionare

O \(.+\)per qualsiasi cosa tra parentesi


2
Questo funzionerà per il testo di esempio, tuttavia se un altro )appare più avanti nella stringa come I expect five hundred dollars ($500). (but I'm going to pay).l'avidità della +cattura molto di più.
Ro Yo Mi

@Denomales Quindi come vorresti che catturasse entrambe le istanze di quelle stringhe. Idealmente sto facendo qualcosa di simile ma vorrei avere: ($500)ed (but I'm going to pay) essere abbinato ma in due partite separate piuttosto che essere considerato un singolo oggetto abbinato? Grazie in anticipo!
Tom Bird,

(. +) ha funzionato per le mie esigenze. Necessario per catturare cose come "Dunhill (Bottle / Packet / Pot / Shot)" e restituire solo "Dunhill"
GentleGiant

5

Per abbinare una sottostringa tra parentesi esclusa qualsiasi parentesi interna che è possibile utilizzare

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

modello. Guarda la demo di regex .

In JavaScript, usalo come

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

Dettagli del modello

  • \(- un (personaggio
  • ([^()]*)- Acquisizione del gruppo 1: una classe di caratteri negata che corrisponde a 0 o più caratteri diversi da (e)
  • \)- un )personaggio.

Per ottenere l'intera corrispondenza, prendi il valore del Gruppo 0, se hai bisogno del testo tra parentesi, prendi il valore del Gruppo 1.

Demo del codice JavaScript più aggiornato (utilizzando 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
});

Demo del codice JavaScript legacy (conforme ES5):


Questa regex è fantastica perché cattura solo coppie di ()e il loro contenuto, anche quando fianco a fianco ()().
limitlessloop

1
@limitlessloop Poiché questa sembra una risposta utile, ho anche aggiunto una nuova matchAlldemo di codice JavaScript basata.
Wiktor Stribiżew,

3

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


2

Alternativa:

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

Se necessario, è possibile sostituire le parentesi con parentesi quadre o ricci


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

Corrisponderà al primo numero che inizia con $ e seguito da ')'. ')' non farà parte della partita. Il codice avvisa con la prima corrispondenza.

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

Questo codice avvisa con tutte le partite.

Riferimenti:

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.