shellgei / shellgei160

書籍: シェル・ワンライナー160本ノックの情報ページ #shellgei160

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

正規表現の {,n} という指定について

kariya-mitsuru opened this issue · comments

すみません、Issue でも何でもなくて単なるコメントなんですが…

PDF 版 P.127 の脚注(注 7)に

EREでは「n個以下」を{,n}と表せますが、筆者(上田)の手元のPCにインストールされているPCREのライブラリでは、表せませんでした。

との記載があったので気になって grep(1) のマニュアルを見たんですが、{,n} の箇所に This is a GNU extension. との記載がありました。
確かにこちらの最後の方の ERE_dupl_symbol を見ると POSIX 的には一つ目の数値は必須のようですね。

また、Perl の方は 5.32.1 のマニュアルには {,n} が無いのですが、最新版の 5.34.0 のマニュアルには {,n} があるので、PCRE もそのうち追いついて使えるようになるかもしれないですね。

なるほど。

個人的には、このようなコメント、参考情報についても Issue としては歓迎でございます。
誌面では説明に焦点をあてている関係上、想定環境 (Ubuntu 20.04 LTS) での検証結果の紹介の記載にとどめている箇所が散見されるので。他の読者の方が見たときに、理解が深まるきっかけになりそうですし、情報交換、ひいてはより後刷りでの表現のブラッシュアップにもつながるかなと。

ただ、内容に関するご質問や誤り報告とは区別してわかるように、専用のラベルを付けるべきかなと思いました。ということで仮おきで「補足情報」とつけてみました。
ディスカッション、とか参考情報、とかもありでしょうか。。(他の方の意見もお伺いしたいところ)。

PCREでもこの表現使えると便利なんですけどね……
最新の PCRE2 のIssueなどを眺める限りは対応する予定はなさそうですね。。
doc上も現時点では仕様っぽいですね。
https://github.com/PhilipHazel/pcre2/blob/0612ed77c2291575b02bb0ea260dfad4890cc347/doc/pcre2.txt#L7909

{,6} is not a quantifier, but a literal string of four characters.

READMEにこのissueのリンクを貼ってcloseしても読めるようにしました。一旦クローズします。

ところで、下記のようにBREでもエスケープすればこの表現は使えるので、GNU 拡張でもあることを踏まえても、本書のこの表現はもう少し正確にする余地がありそうですね。

~ $ echo 12345 | grep -Go '[0-9]\{,3\}'
123
45

man grep より、GNU grep だと BRE/ERE で機能上の違いはないのでそう言われればそう。

grep understands three different versions of regular expression syntax: "basic" (BRE), "extended" (ERE) and "perl" (PCRE).
In  GNU  grep  there  is  no  difference  in  available  functionality  between  basic  and  extended  syntaxes.  In other

PCRE の文法は man pcresyntax で確認できるので、そこを見ても良さそう。