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 /.+/?

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.


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' ]

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.


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.


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


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


3

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


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,'');

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"].

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.