以下は、小数点以下の数字を小数点第二位或いは、第三位に切り捨てる正規表現です。
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
プレビュー