kyoneco’s blog

教育、数学、統計といったテーマについて考えていきます

正規表現 第二章 肯定否定先後読み 読書メモ

先読みの別の例

JeffsになっているものをJeff'sに置き換えたい

s/\bJeff(?=s\b)/Jeff'/g
先読みの部分はsの前の位置へマッチ
 

後読みも併用する

(?<=\bJeff)(?=s\b)/'/g
どのテキストにもマッチせずアポストロフィを追加したい位置にマッチする。
マッチした無文字をアポストロフィに置換する
 

数値にカンマを入れる例

s/(?<=\d)(?=(\d\d\d)+$)/,/g
左側に何らかの数字 →(?<=\d)
ちょうど3個の数字 →\d\d\d
3個セットが複数あるとき →(\d\d\d)+
後ろに余計なものが続かないようにする →(\d\d\d)+$
 

単語の境界と否定の先後読み

より長い文字列の中に埋め込まれた数値にもカンマを挿入したい

肯定の後読み (?<=) 部分式が左側にマッチするときに成功する
否定の後読み (?<!) 部分式が左側にマッチしないときに成功する
肯定の先読み (?=) 部分式が右側にマッチするときに成功する
否定の先読み (?!) 部分式が右側にマッチしないときに成功する
 
語の境界:片側が\wで反対側が\wでない位置
単語の先頭:(?<!\w)(?=\w) 
単語の末尾:(?<=\w)(?!\w)
 

3桁ずつ数字をきりとる

s/(?<=\d)(?=(\d\d\d)+(?!\d))/,/g
 

メモ

先読み、後読みの例をさらに解説している節です。肯定と否定の先後読みも新しいものとしてでてきました。\bを先後読みで表現できることも説明されています。