Memoize |
BasicWerk
EC Support
Technique
Facebook
|
20140726133218_factor_regexp_white_space_and_parsing_word |
factor_regexp_white_space_and_parsing_word
regexp の parsing word (R/ など) は後ろに「1個以上」のスペースを必要とする。 きっかり1個ではなくて、1個以上のスペースが parsing の為のスペースとみなされる。
例えばこんな文字列があったとする。
"bbb aaa bbb bbb ccc"
上記文字列のアンダーラインの部分、つまり「先頭がスペースで始まる bbb のみを消したい」としよう。
もしこれを sed で書くならこれだけで良い。
% sed 's/ bbb//g' <(echo -n "bbb aaa bbb bbb ccc") bbb aaa ccc
sed の s/ bbb//g は s/ から次の / までが単純に正規表現とみなされるからだ。
ところが factor で同じ書き方をすると・・・
IN: scratchpad auto-use "bbb aaa bbb bbb ccc" R/ bbb/ "" re-replace . " aaa ccc"
R/ のあと、bbb までの間にある半角スペースは「全て」 word と word を区切るセパレータとみなされて、bbb 直前のスペースは正規表現の一部とはならない。 よって、対象文字列の中間にあるターゲットだけでなく、先頭にある bbb も消されてしまう(re-replace は常にグローバル置換を行うので)。
これを回避するには方法は(ぱっと思いつく限りで)2つある。
! 正規表現の文字クラス(ブラケット)でホワイトスペースを表現 IN: scratchpad auto-use "bbb aaa bbb bbb ccc" R/ [ ]bbb/ "" re-replace . "bbb aaa ccc" ! 文字列から正規表現オブジェクトを生成 IN: scratchpad auto-use "bbb aaa bbb bbb ccc" " bbb" <regexp> "" re-replace . "bbb aaa ccc"
#factorcode |
© Shin Nakamura/BasicWerk 2014 |