やりたいこと
'abc_def'.split('_') = ['abc', '_', 'def']; // 実際は['abc', 'def']
例によってStackoverflowに答えがあり引数に区切り文字を()
で囲んだ正規表現リテラルを渡せばよかった。
'abc_def'.split(/(_)/g);
なぜこうなるのか
自分の正規表現知識が足りないだけかと思ったがMDNにも書かれているECMAScriptの仕様だった。
If separator is a regular expression with capturing parentheses, then each time separator matches, the results (including any undefined results) of the capturing parentheses are spliced into the output array.
つまりは()
内にマッチした部分も結果に含められるようになる。
なのでちょっとしたパースもできる。覚えておくと役に立ちそう。
'<div>abc<span>def</span></div>'.split(/(<\/?[a-z]+>)/g)
= ['', '<div>', 'abc', '<span>', 'def', '</span>', '', '</div>', '']