以下は、小数点以下の数字を小数点第二位或いは、第三位に切り捨てる正規表現です。
s/(\.\d\d[1-9]?)\d+/$1/
だたこの正規表現は、1.234のような小数点第三位の小数に対しても有効になってしまい、つまり2が\d、3も\d、4が\d+
にマッチしてしまいます。つまり1.23となってしまうのです。[1-9]?に4がマッチしても、必須ではなく他に試せる保存ステートが残っており、
それを試すと、[1-9]?には、マッチせず\d+という必須の一つが4にマッチする。
カレントステートを▲、正規表現を見ている開始位置を△とすると、
.が小数点、\dが2、\dが3にマッチしたあと
△1.23▲4 (.\d\d▲[1-9]?)\d+
…4が[1-9]?にマッチするかどうかの前に、失敗した時のため、保存ステートリストに「△1.23▲4 (.\d\d[1-9]?)▲\d+」を保存。
4と[1-9]?は、マッチするので先に進む。
△1.234▲ (.\d\d[1-9]?)▲\d+
…空白と一個以上の数字は、マッチしないので失敗。
ここで、先ほど保存していた状態のうち、一番最後のものを復活させる。
△1.23▲4 (.\d\d[1-9]?)▲\d+
…数字の4と一個以上の数字は、マッチするので先に進む。
△1.234▲ (.\d\d[1-9]?)\d+▲
…正規表現の末尾に来たので終了。
というような図が出来たのですが、これは合っていますか。
まず、「カレントステート」「保存ステート」の意味を説明していただいた方がいいと思います。それと、改行が乱れていてちょっと読みにくいです。
回答3件
あなたの回答
tips
プレビュー