質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

1416閲覧

ES6 正規表現 マッチ位置について

Fujiman

総合スコア41

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2018/10/17 05:14

編集2018/10/17 13:31

背景

ES6で正規表現において拡張されたものとしてマッチした位置の保持があると聞き、
その動作を確認するためのをサンプルコードです

サンプルコードの概要

正規表現のパターンと、マッチしたときの処理関数をプロパティーに持つオブジェクトを
いくつかを配列にして、検証対象文字列を配列の順でマッチをチェックしていく関数です。
マッチした時、保持しているはずのlastindexプロパティーを出力し確認するようにしています

ところが以下のコードの出力は、5,6,11,12,18になります。
わからない点は6と12が出てきてしまう点です。
これら数字の示す位置はパターンにない1コの空白なのにどうして出力されてしまうのでしょうか?
空白といえばここでは、/\s*/yの部分とおもうのですが・・・コードからして関係なさそうですし。
自分の理解が実際の処理のロジックと何がかけ離れてるのか教えてほしいです

JavaScrip

1var parser = (input, match) => { 2 for (var pos = 0, lastPos = input.length; pos < lastPos;) { 3 for (var i = 0; i < match.length; i++) { 4 match[i].pattern.lastIndex = pos 5 var found 6 if ((found = match[i].pattern.exec(input)) !== null) { 7 match[i].action(found) 8 pos = match[i].pattern.lastIndex 9 console.log(pos) 10 break 11 } 12 } 13 } 14} 15 16var report = (match) => { 17 // console.log(JSON.stringify(match)) 18} 19 20parser("Foo 1 Bar 7 Baz 42", [{ 21 pattern: /Foo\s+(\d+)/y, 22 action: (match) => report(match) 23}, { 24 pattern: /Bar\s+(\d+)/y, 25 action: (match) => report(match) 26}, { 27 pattern: /Baz\s+(\d+)/y, 28 action: (match) => report(match) 29}, { 30 pattern: /\s*/y, 31 action: (match) => {} 32}])

実行環境

VS CODE ver 1.28.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

マッチした文字列のある index を配列で返す関数と認識して、よろしいでしょうか。

g フラグ未指定の RegExp.prototype.execlastIndex プロパティを更新します。
従って、y フラグを使用する必要がなく、pos 管理も不要で、思えます。

以下、出先なので未検証です。

JavaScript

1for (var i = 0. l = match.length, reg, result; i < l; ++i) { 2 reg = match[i]; 3 4 while (result = reg.exec(input)) { 5 console.log(reg.lastIndex); 6 } 7}

Re: Fujiman さん

投稿2018/10/17 10:35

think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Fujiman

2018/10/17 13:36 編集

ありがとうございます。 それでした。全部、フラグをgにして大丈夫でした。 更新したlastIndex が’出てきているということでした。 時間のない時に質問だけ投げたくて、 この関数の意図とか目的の説明が不足してて 何がしたいのかわかりにくくなってると 後で思い、反省しました。 本文の方に追加してます。
guest

0

とりあえず今のままだと外側のposのforが無限ループしてませんか?

投稿2018/10/17 07:31

yambejp

総合スコア114829

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Fujiman

2018/10/17 13:14

ループそのものは完了して抜けてきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問