[解決済み] Javascriptのregex.exec()はなぜいつも同じ値を返さないのですか?重複
2022-05-27 04:10:19
質問
ChromeやFirebugのコンソールで。
reg = /ab/g
str = "abc"
reg.exec(str)
==> ["ab"]
reg.exec(str)
==> null
reg.exec(str)
==> ["ab"]
reg.exec(str)
==> null
exec は何らかのステートフルなもので、前回何を返したかに依存するのでしょうか?それともこれは単なるバグですか?私はそれが常に起こるようにすることはできません。例えば、上の'str'が"abc abc"だった場合、それは起きないのです。
どうすれば解決しますか?
JavaScript
RegExp
オブジェクトはステートフルです。
正規表現がグローバルな場合、同じ正規表現オブジェクトに対してメソッドを呼び出すと、最後にマッチした部分の過去のインデックスから開始されます。
これ以上マッチが見つからなくなると、インデックスがリセットされ
0
に自動的にリセットされます。
手動でリセットするには
lastIndex
プロパティを設定します。
reg.lastIndex = 0;
これは非常に便利な機能です。必要であれば、文字列の任意の位置で評価を開始することができますし、ループ内であれば、任意の数のマッチの後に評価を停止することができます。
以下は、ループ内で正規表現を使用する典型的なアプローチのデモです。これは
exec
が返す
null
をループ条件として代入し、マッチングが無くなれば
var re = /foo_(\d+)/g,
str = "text foo_123 more text foo_456 foo_789 end text",
match,
results = [];
while (match = re.exec(str))
results.push(+match[1]);
DEMO。 http://jsfiddle.net/pPW8Y/
課題の配置が気に入らない場合は、例えばこのようにループを作り直すことも可能です...。
var re = /foo_(\d+)/g,
str = "text foo_123 more text foo_456 foo_789 end text",
match,
results = [];
do {
match = re.exec(str);
if (match)
results.push(+match[1]);
} while (match);
関連
-
[解決済み】<select>で現在選択されている<option>をJavaScriptで取得するにはどうすればよいですか?
-
[解決済み] jQuery textareaのテキストを取得する
-
[解決済み] 私のJavaScriptコードは "No 'Access-Control-Allow-Origin' header is present on requested resource "というエラーを受け取りますが、Postmanはそうならないのはなぜですか?
-
[解決済み] なぜ ++[[]][+[] +[+[]] は "10" という文字列を返すのでしょうか?
-
[解決済み] CSSは常にJavascriptより優先されるべきか?
-
[解決済み] parseInt(1/0, 19)はなぜ18を返すのですか?
-
[解決済み] jQueryやgetElementByIdのようなDOMメソッドが、要素を見つけられないのはなぜですか?
-
[解決済み] chromedriverでSeleniumを使用していることをWebサイトで検出することは可能ですか?
-
[解決済み] Node.jsのfs.readFile()はなぜ文字列ではなくバッファを返すのでしょうか?
-
[解決済み】JavaScript / HTML5での効果音について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JSアレイループと効率解析の比較
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
vueのグローバルがscss(mixin)を導入。
-
[解決済み] テスト
-
[解決済み】JavaScriptでインラインIF文の書き方は?
-
[解決済み】 `string.split is not a function` というエラーの原因は何ですか?
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
[解決済み】リクエストに失敗していないのに、「TypeError: failed to fetch」が表示される。
-
JavaScriptのgetElementById()メソッド入門
-
[解決済み】グローバルフラグを持つRegExpが間違った結果を出すのはなぜですか?