Was bedeutet das Flag 'g' in regulären Ausdrücken?

110

Was bedeutet die gFlagge in regulären Ausdrücken?

Was ist der Unterschied zwischen /.+/gund /.+/?

Intelis
quelle

Antworten:

130

gist für die globale Suche. Das heißt, es wird mit allen Vorkommen übereinstimmen. Normalerweise sehen Sie auch, iwas bedeutet, Groß- und Kleinschreibung zu ignorieren.

Referenz: global - JavaScript | MDN

Das "g" -Flag gibt an, dass der reguläre Ausdruck gegen alle möglichen Übereinstimmungen in einer Zeichenfolge getestet werden soll.

Ohne die gFlagge wird nur der erste Test durchgeführt.

Sachleen
quelle
1
Das / g-Flag ist also bei Verwendung der .test-Funktion irrelevant, da es sowieso nur die erste Übereinstimmung findet, oder?
xr280xr
10
@ xr280xr Nicht irrelevant, eher kontraproduktiv. Wenn Sie RegExp wiederverwenden, wird dies zu Problemen führen. var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
Janosch
40

Beispiel in Javascript zur Erklärung:

> 'aaa'.match(/a/g)
[ 'a', 'a', 'a' ]

> 'aaa'.match(/a/)
[ 'a', index: 0, input: 'aaa' ]
Luke W.
quelle
10

g ist das globale Suchflag.

Das globale Suchflag führt die RegExp-Suche nach einem Muster in der gesamten Zeichenfolge durch und erstellt ein Array aller Vorkommen, die mit dem angegebenen Muster übereinstimmen.

Der Unterschied zwischen /.+/gund /.+/ besteht darin, dass die gVersion jedes Vorkommen findet und nicht nur das erste.

davepmiller
quelle
9

Es gibt keinen Unterschied zwischen /.+/gund, /.+/da beide nur einmal mit der gesamten Zeichenfolge übereinstimmen. Dies gmacht einen Unterschied, ob der reguläre Ausdruck mehr als einmal übereinstimmen könnte oder Gruppen enthält. In diesem Fall .match()wird ein Array der Übereinstimmungen anstelle eines Arrays der Gruppen zurückgegeben.

Neil
quelle
8

Wie @matiska hervorhob, setzt das gFlag daslastIndex Eigenschaft.

Ein sehr wichtiger Nebeneffekt davon ist, dass wenn Sie dieselbe Regex-Instanz für eine übereinstimmende Zeichenfolge wiederverwenden, diese möglicherweise fehlschlägt, da sie erst bei der Suche beginnt lastIndex.

// regular regex
const regex = /foo/;

// same regex with global flag
const regexG = /foo/g;

const str = " foo foo foo ";

const test = (r) => console.log(
    r,
    r.lastIndex,
    r.test(str),
    r.lastIndex
);

// Test the normal one 4 times (success)
test(regex);
test(regex);
test(regex);
test(regex);

// Test the global one 4 times
// (3 passes and a fail)
test(regexG);
test(regexG);
test(regexG);
test(regexG);

Kammerherr
quelle
6

Neben der bereits erwähnten Bedeutung der gFlagge beeinflusst sie das regexp.lastIndexEigentum:

Der lastIndex ist eine Lese- / Schreib-Integer-Eigenschaft von Instanzen mit regulären Ausdrücken, die den Index angibt, bei dem die nächste Übereinstimmung gestartet werden soll. (...) Diese Eigenschaft wird nur festgelegt, wenn die Instanz des regulären Ausdrucks das Flag "g" verwendet, um eine globale Suche anzuzeigen.

Referenz: Mozilla Developer Network

Matiska
quelle
3

G in regulären Ausdrücken definiert eine globale Suche, dh, es wird nach allen Instanzen in allen Zeilen gesucht.

Neonguardian
quelle
1

Gibt ein Beispiel basierend auf einer Zeichenfolge. Wenn wir alle Vorkommen aus einer Zeichenfolge entfernen möchten. Sagen wir, wenn wir alle Vorkommen von "o" mit "" aus "Hallo Welt" entfernen wollen.

"hello world".replace(/o/g,'');
Deepak
quelle
0
  1. g -> gibt alle Übereinstimmungen zurück
  2. without g -> Gibt die erste Übereinstimmung zurück

Beispiel:

  1. '1 2 1 5 6 7'.match(/\d+/)kehrt zurück ["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]. Wie Sie sehen, können wir nur das erste Spiel bestreiten "1".
  2. '1 2 1 5 6 7'.match(/\d+/g)Gibt ein Array aller Übereinstimmungen zurück ["1", "2", "1", "5", "6", "7"].
Nagibaba
quelle
1
Bitte erläutern Sie dies weiter - was ist der Unterschied zwischen "allen Spielen" und "erstem Spiel"?
Nico Haase
Ich erklärte mehr. Vielen Dank für Ihre Anleitung
Nagibaba
@NicoHaase können Sie bitte Ihre negative Rate entfernen? Ich habe versucht, erklärender zu sein.
Nagibaba
Entschuldigung für das Missverständnis :)
Nagibaba