正規表現入門 (3)
前回までのあらすじ。EREに入門したはずなのに、Localeの隘路にはまりこんでいた。
今回のあらすじ。不正 (invalid) と未定義 (undefined) の隘路にはまりこむ。
正規表現クイズ!
a{4,2}
a{4}{2}
^$
$^
^{0}$
${0}^
答えあわせタイム!
a{m,n}
はmがn以下でなければならないので不正- 未定義(GNU実装では
a{8}
と等価になる。エラーになる実装もある) - 空文字列にマッチする
- 空文字列にマッチする
- 未定義(GNU実装では空文字列にマッチする。エラーになる実装もある)
- よく判らない(GNU実装では空文字列にマッチする。エラーになる実装もある)
よく判らないのはEREの文法がウンコだから。歴史があるンだろう。経緯があるンだろう。実装を拾いあつめ、最大公約数を求めたら、ウンコがあった。きっと、そういうことなんだろう。
One or more
ERE_dupl_symbols
appearing first in an ERE, or immediately following '|
', '^
', or '(
'
だいたい、^
や$
に結合の優先順位が定められているのも良く判らない。^foo|bar$
が、(^foo)|(bar$)
であって^(foo|bar)$
でないことを明確にしたいという思いがあるンだろう。思いなんて知ったことか。(PCREやECMAScriptがそうであるように)ゼロ幅表明として扱ったほうがスッキリする。
続くだろうか。