g
正規表現のフラグの意味は何ですか?
/.+/g
との違いは何/.+/
ですか?
g
グローバル検索用です。つまり、すべてのオカレンスに一致します。i
通常、大文字と小文字を区別しないことを意味することもわかります。
「g」フラグは、文字列内のすべての可能な一致に対して正規表現をテストする必要があることを示します。
g
フラグがないと、最初のテストのみが行われます。
説明するJavascriptの例:
> 'aaa'.match(/a/g)
[ 'a', 'a', 'a' ]
> 'aaa'.match(/a/)
[ 'a', index: 0, input: 'aaa' ]
g
グローバル検索フラグです。
グローバル検索フラグにより、RegExpは文字列全体のパターンを検索し、指定されたパターンに一致するすべての出現箇所の配列を作成します。
/.+/g
したがって、との違い /.+/
は、g
バージョンが最初の出現だけでなくすべての出現を検出することです。
@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);
/.+/g
との間に違いはありません/.+/
。どちらも文字列全体に一度だけ一致するためです。g
正規表現が複数回一致する可能性がある場合、またはグループが含まれている場合は、が違います。この場合、グループ.match()
の配列ではなく、一致の配列が返されます。
すでに述べたg
フラグの意味に加えて、それはregexp.lastIndex
プロパティに影響を与えます。
lastIndexは、正規表現インスタンスの読み取り/書き込み整数プロパティであり、次の一致を開始するインデックスを指定します。(...)このプロパティは、正規表現インスタンスがグローバル検索を示すために「g」フラグを使用した場合にのみ設定されます。
g
->
すべての一致を返しますwithout g
->
最初の一致を返します例:
'1 2 1 5 6 7'.match(/\d+/)
を返します["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]
。ご覧のとおり、最初の一致のみを取得できます"1"
。'1 2 1 5 6 7'.match(/\d+/g)
すべての一致の配列を返します["1", "2", "1", "5", "6", "7"]
。正規表現のGは、グローバル検索を定義します。つまり、すべての行のすべてのインスタンスを検索します。
文字列に基づいた例を示します。文字列からすべてのオカレンスを削除したい場合。「helloworld」から「o」と「」の出現をすべて削除したい場合は、
"hello world".replace(/o/g,'');