質問: 以下は、小数点以下の数字を小数点第二位或いは、第三位に切り捨てる正規表現です。 ``` 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+▲ ...正規表現の末尾に来たので終了。 というような図が出来たのですが、これは合っていますか。
回答: バックトラックするかどうかは実装によって異なります。 DFA を使いバックトラック無しでマッチさせる実装もあります。