3

理由はわかりませんが、Chrome 開発ツールの正規表現テストは、呼び出されるたびに異なる結果を返します。テストする文字列としてこれを持っています:

SELECT tbl_school.id AS tbl_school_id, school, tbl_students.id AS tbl_students_id, name, hobby, school_id, course_id FROM tbl_school, tbl_students WHERE tbl_school.id = 's' dd
ORDER BY tbl_school.id ASC

where 正規表現は次のとおりです。

var where_regex = /where/ig

これは結果のスクリーンショットです。呼び出されるたびに変更されていることがわかりますが、文字列は何も変更していません。これについての説明を本当に感謝します

ここに画像の説明を入力

4

1 に答える 1

5

これは、/gフラグと、同じ正規表現オブジェクトが使用されているためです。ドキュメントの引用(MDN

と同様にexec(またはそれと組み合わせて)、test同じグローバル正規表現インスタンスで複数回呼び出されると、前の一致を超えて進みます。

このことを考慮:

var r = /w/g;
console.log( r.test('Awa') ); // true
console.log( r.test('Awa') ); // false
console.log( r.test('Awa') ); // true
console.log( r.test('Awa') ); // false

console.log( /w/ig.test('Awa') ); // true
console.log( /w/ig.test('Awa') ); // true
console.log( /w/ig.test('Awa') ); // true
console.log( /w/ig.test('Awa') ); // true

ステートメントの最初のグループ(r変数に格納されている同じ正規表現オブジェクトを使用)では、2番目の一致は最初の一致が終了した場所(つまり、 w)から始まります。失敗した後に使用するとリセットされることに注意してください//g.test。したがって、一致はその行の先頭から開始されます。

ただし、ステートメントの2番目のグループでは、新しい正規表現オブジェクトが作成されるたびに、これらのそれぞれが(明らかに)最後の一致の位置を個別に格納します。したがって、そこには4つtrueあります。

/g肝心なのは、メソッドで使用するのはかなり奇妙なtestことです。もちろん、パターンで文字列をウォークオーバーしたい場合を除きます。またはをtest返す(そして何もキャプチャしない)ことを忘れないでください。したがって、通常の場合、正規表現グローバルモードを有効にすることは、控えめに言っても冗長です。truefalse

于 2012-11-02T13:20:55.987 に答える