正規表現の「g」フラグの意味は何ですか?


回答:


130

gグローバル検索用です。つまり、すべての出現に一致します。通常は、i大文字と小文字を区別しないこともわかります。

リファレンス:グローバル-JavaScript | MDN

「g」フラグは、正規表現を文字列内のすべての可能な一致に対してテストする必要があることを示します。

なければgフラグ、それだけで最初のためにテストします。


1
したがって、.test関数を使用する場合、/ gフラグは関係ありません。とにかく最初の一致のみを見つけるためです。
xr280xr 2017

10
@ xr280xr無関係ではなく、逆効果のようです。RegExpを再利用すると、問題が発生します。var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
Janosch 2018年


40

説明するJavascriptの例:

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

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

10

g グローバル検索フラグです。

グローバル検索フラグは、文字列全体でパターンをRegExp検索し、指定されたパターンに一致するすべての出現の配列を作成します。

差となるよう /.+/gとして/.+/ いることであるgバージョンだけではなく、最初のすべての出現を検索します。


9

差がない/.+/g/.+/、彼らは両方しか一度文字列全体にマッチしますのでは。g正規表現が複数回一致するか、またはケースがいるグループ、含まれていることができれば違いは.match()マッチの配列の代わりに、グループの配列を返しますが。


8

@matiskaが指摘したように、gフラグはlastIndexプロパティも設定します。

これの非常に重要な副作用は、一致する文字列に対して同じ正規表現インスタンスを再利用している場合、でのみ検索を開始するため、最終的には失敗し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

すでに述べたgフラグの意味に加えて、それはregexp.lastIndexプロパティに影響を与えます:

lastIndexは、正規表現インスタンスの読み取り/書き込み整数プロパティで、次の一致を開始するインデックスを指定します。(...)このプロパティは、正規表現インスタンスが「g」フラグを使用してグローバル検索を示す場合にのみ設定されます。

リファレンス:Mozilla Developer Network



1

文字列に基づく例を示します。文字列からすべての出現を削除したい場合。「o」のすべての出現を「hello world」から「」で削除したいとしましょう

"hello world".replace(/o/g,'');

0
  1. g -> すべての一致を返します
  2. without g -> 最初の一致を返します

例:

  1. '1 2 1 5 6 7'.match(/\d+/)を返します["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]。ご覧のように、最初の試合しか行えません"1"
  2. '1 2 1 5 6 7'.match(/\d+/g)すべての一致の配列を返します["1", "2", "1", "5", "6", "7"]

1
さらに説明してください-「すべての一致」と「最初の一致」の違いは何ですか?
Nico Haase

詳細を説明しました。ご指導ありがとうございます
ナギババ

@NicoHaaseあなたはあなたの負のレートを削除していただけますか?私はもっ​​と説明的にしようとしました。
Nagibaba

誤解してすみません:)
ナギババ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.