javascriptのRegex#execを使うと、正規表現=>文字列の順で並べる事ができます。
実際のところ
基本的挙動
結果は配列に格納されます。
- 最初:マッチした全文
- 以降:マッチしたワード
- index:マッチした先頭文字番号
- input:入力した全文
(/(\b)(\w+)(,*)/g).exec("hoge") //[ 'hoge', '', 'hoge', '', index: 0, input: 'hoge' ]
実例
'Si Vis Pacem, Para Bellum'という文字を単語ごとに切り分け、次は何文字目から始まるか表示するケースを考えます。
参考もとではwhileでしたが、せっかくなので再帰表現で書いてみます。
const myRe = /(\b)(\w+)(,*)/g; var str = 'Si Vis Pacem, Para Bellum'; var myArray = new Array(); test(str) function test(str) { if(!(myArray = myRe.exec(str))) { return } console.log("Found: %s.\tNext Word start at char#%s." ,myArray[2],(myRe.lastIndex + 1)) test(str) }
出力はこんな感じ
$ node test.js Found: Si. Next Word start at char#3. Found: Vis. Next Word start at char#7. Found: Pacem. Next Word start at char#14. Found: Para. Next Word start at char#19. Found: Bellum. Next Word start at char#26.
内部的には、呼び出されるたびに、indexの値を参照して次のマッチまで進んでいるようです。
このメソッドは配列を吐き出すのみで、非破壊的です。
全部終わったらnullになり、配列のデータ型も破壊されます。
myArray = [] myArray = myRe.exec(str) /* [ 'Si', '', 'Si', '', index: 0, input: 'Si Vis Pacem, Para Bellum' ] */ myArray = myRe.exec(str) /* [ 'Vis', '', 'Vis', '', index: 3, input: 'Si Vis Pacem, Para Bellum' ] */ myArray = myRe.exec(str) /* [ 'Pacem,', '', 'Pacem', ',', index: 7, input: 'Si Vis Pacem, Para Bellum' ] */ str // 'Si Vis Pacem, Para Bellum'