Regulärer Ausdruck, um eine Zeichenfolge zwischen Klammern in Javascript zu erhalten

177

Ich versuche, einen regulären Ausdruck zu schreiben, der eine Zeichenfolge zwischen Klammern zurückgibt. Zum Beispiel: Ich möchte die Zeichenfolge erhalten, die sich zwischen den Zeichenfolgen "(" und ")" befindet.

I expect five hundred dollars ($500).

würden zurückkehren

$500

Gefunden Regulärer Ausdruck eine Zeichenkette zwischen zwei Strings in Javascript zu bekommen

Aber ich bin neu bei Regex. Ich weiß nicht, wie ich '(', ')' in Regexp verwenden soll

Okky
quelle
Sie können die unten stehende Lösung von go-oleg verwenden, die leicht modifiziert wurde, um das Dollarzeichen zu testen:var regExp = /\(\$([^)]+)\)/;
Dom Day

Antworten:

460

Sie müssen eine Reihe von maskierten (mit \) Klammern (die mit den Klammern übereinstimmen) und eine Gruppe von regulären Klammern erstellen, die Ihre Erfassungsgruppe erstellen:

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

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

Nervenzusammenbruch:

  • \( : Entspricht einer öffnenden Klammer
  • ( : Beginnen Sie mit der Erfassung der Gruppe
  • [^)]+: Entspricht einem oder mehreren Nicht- )Zeichen
  • ) : Erfassungsgruppe beenden
  • \) : Übereinstimmende schließende Klammern

Hier ist eine visuelle Erklärung zu RegExplained

go-oleg
quelle
12
+1 Schön, hat wie ein Zauber funktioniert. Ich möchte Sie hinzufügen, um diese tinyurl.com/mog7lr3 für eine visuelle Erklärung in Ihre hinzuzufügen .
Praveen
5
@ user1671639: Aktualisiert. Danke für den Link!
go-oleg
5
Dies funktioniert nicht, wenn die Klammern, die Sie erfassen möchten, Klammern enthalten. Zum Beispiel: "Ich erwarte fünfhundert Dollar (500 Dollar (aber ich weiß, dass ich das Geld nie wieder sehen werde))."
JayB
1
Diese Regex funktioniert nur, wenn eine Instanz pro Stich übereinstimmt. Die Verwendung des globalen /gFlags funktioniert nicht wie erwartet.
SeideAdmin
2
Was ist die Lösung, wenn Sie mehrere Zeichenfolgen in Klammern wie unten haben: "Ich erwarte (fünf) hundert Dollar (500 US-Dollar)" Nehmen wir an, ich möchte ein Array dieser speziellen Zeichenfolgen.
Mohamad Al Asmar
33

Versuchen Sie es mit einer String-Manipulation:

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

oder Regex ( was im Vergleich zu oben etwas langsam ist )

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));
}
Herr Green
quelle
7
Mit diesem JSperf heute in Chrome 59.0.3071 war der Regex um 8% schneller
Alex McMillan
9

Portierte Mr_Green Antwort auf eine funktionale Programmierung Stil Verwendung von temporären globalen Variablen zu vermeiden.

var matches = string2.split('[')
  .filter(function(v){ return v.indexOf(']') > -1})
  .map( function(value) { 
    return value.split(']')[0]
  })
SilidAdmin
quelle
Was ich gesucht habe. stackoverflow.com/questions/49614116/…
Wobsoriano
8

Einfache Lösung

Hinweis : Diese Lösung kann für Zeichenfolgen verwendet werden, die in dieser Frage nur einzelne "(" und ")" ähnliche Zeichenfolgen enthalten.

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

Online-Demo (jsfiddle)

Ali Soltani
quelle
5

Für nur Ziffern nach einem Währungszeichen: \(.+\s*\d+\s*\)sollte funktionieren

Oder \(.+\)für irgendetwas in Klammern

P0W
quelle
2
Dies funktioniert für den Beispieltext. Wenn jedoch )später in der Zeichenfolge ein anderer Text angezeigt wird, wird I expect five hundred dollars ($500). (but I'm going to pay).die Gier des Textes +viel mehr erfassen.
Ro Yo Mi
@Denomales Wie würden Sie also beide Instanzen dieser Zeichenfolgen erfassen lassen? Im Idealfall mache ich etwas Ähnliches, möchte es aber haben: ($500)und (but I'm going to pay) abgeglichen zu werden, aber in zwei getrennten Übereinstimmungen, anstatt als ein einzelnes übereinstimmendes Element betrachtet zu werden? Danke im Voraus!
Tom Bird
(. +) arbeitete für meine Anforderung. Benötigt, um Sachen wie "Dunhill (Flasche / Paket / Topf / Schuss)" zu erfassen und nur "Dunhill" zurückzugeben
GentleGiant
5

Zum Abgleichen eines Teilstrings in Klammern mit Ausnahme der möglicherweise verwendeten inneren Klammern

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

Muster. Siehe die Regex-Demo .

Verwenden Sie es in JavaScript wie folgt

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

Musterdetails

  • \(- ein (char
  • ([^()]*)- Erfassen von Gruppe 1: Eine negierte Zeichenklasse, die mit 0 oder mehr Zeichen als (und übereinstimmt)
  • \)- ein )char.

Um die gesamte Übereinstimmung zu erhalten, greifen Sie auf den Wert für Gruppe 0 zu. Wenn Sie den Text in Klammern benötigen, greifen Sie auf den Wert für Gruppe 1 zu.

Die aktuellste JavaScript-Code-Demo (mit 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
});

Legacy-JavaScript-Code-Demo (ES5-kompatibel):

Wiktor Stribiżew
quelle
Diese Regex ist großartig, da sie nur Paare von ()und deren Inhalt erfasst , selbst wenn sie nebeneinander liegen ()().
Limitlessloop
1
@limitlessloop Da dies eine hilfreiche Antwort zu sein scheint, habe ich auch eine neue matchAllJavaScript-Code-Demo hinzugefügt .
Wiktor Stribiżew
3

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

Und rannte
quelle
2

Alternative:

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

Bei Bedarf können Klammern durch eckige oder geschweifte Klammern ersetzt werden

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

Entspricht der ersten Zahl, beginnend mit einem $ und gefolgt von ')'. ')' wird nicht Teil des Spiels sein. Der Code warnt bei der ersten Übereinstimmung.

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

Dieser Code warnt bei allen Übereinstimmungen.

Verweise:

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

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

AJ Dhaliwal
quelle