Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

Regex#execを使うと、正規表現=>文字列の順で並べる事ができる。

javascriptRegex#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'