Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

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'