iidaの日記: sedとjshellの置換(続) 3
日記 by
iida
承前
「『a*』だと0文字にも照合するので、隙間も置換される」というのは、のは納得がいくし、ある意味、正規表現のFAQみたいなものだ。
今まだよくわかっていないのは、先頭の0文字目の処理が、sedとjshell(というかJavaか)で違った理由だ。
「最長一致という考えが無い」というコメントもちょうだいしたが、Javaでは、
X*は最長一致数量子
X*?は最短一致数量子
X*+は強欲数量子
という仕様になっている。
aとbの間 (スコア:1)
以下の結果を見ると、aの前では無くてaとbの間の隙間が置換されているっぽいですね。
jshell> System.out.println("aba".replaceAll("(a*)","A($1)"));
A(a)A()bA(a)A()
バグとしか思えない (スコア:0)
「Javaでも最長一致が仕様」であるならば、"マッチした部分"が2要素に分断されているので、私なら仕様違反とみなしますね。
食欲の秋 (スコア:1)
試してみるとperlでもAAbAになる。
(g修飾子外すとAb)
bとかaとか見てたらJavaScriptで('b'+'a'+ + 'a' + 'a').toLowerCase()が'banana'になる話 [stackoverflow.com]を思い出した。
(種明かし [hatena.ne.jp])
>強欲数量子
「最長一致」の意味で「貪欲」(greedy)と形容することがよくある気がするので、そこに似たような意味の「強欲」というのはなんか混乱しそうな気がする。
possessive quantifierを辞書的に訳すならperldocにもある所有格量指定子 [perldoc.jp]なんだろうけど字面見ても作用がわかりにくい。
ただ同じperldocでも訳語が統一されてなくて絶対量指定子 [perldoc.jp]とする文章もあって個人的にはこちらの方が多少分かりやすい気はする。
正規表現におけるバックトラック抑止をどういうイメージで伝えるかの問題なのだとは思うが素直に「バックトラックを抑止」と言った方が伝わるような気がしなくもない。