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