ときどきの雑記帖 RE* (新南口)
The Six Million Dollar Man
ファントム無頼
ふと検索してみたらKindleにファントム無頼 (全12巻) Kindle版が!
一年近く前に 新谷かおる作品が軒並みKindleストアからなくなったという話 があったけどあれはなんだったんだ…
大魔神
メモメモ
BS日テレ 「大魔神」シリーズ4K修復版を三夜連続放送 - amass
正規表現の文字クラスで]を置くには
正規表現(の仕様)とは直接関係ないけど、mawkの1.3.3では /[/]/と書くとブラケットの中の /を正規表現リテラルの終端と解釈してしまって エラーになるという「仕様」だったはず(/に\を前置して回避できる)。
あるときこれを「バグだよね?」と作者(Mike Brennan)にメールで問い合わせたことがあるんだけど 「オリジナルのawkもその動作じゃボケ」(チョー訳) という返事が返ってきたなあ(遠い目)。 実際(少なくとも当時のオリジナル == One True Awkは)そうだったんだけど。
という話題を書いたのだけど、最近one true awk のissueでこういう awk cannot parse constant regex expression of slash character within a character class (/[/]/) · Issue #135 · onetrueawk/awk のが出てきて個人的にはちょっとうけた。
$ make $ ./a.out '/[/]/' ./a.out: non-terminated regular expression [/... at source line 1 context is >>> /[/ <<< ./a.out: nonterminated character class [/ source line number 1
According to the book, page 29, section 2.1:
Inside a character class, all characters have their literal meaning, except for the quoting character , ^ at the beginning, and ~ between two characters.
Thus /[/]/ should be grammatically equivalent to /\//, which both matches any occurrence of a slash character.
- Handle a ‘/’ inside a bracket expression when parsing a regex. by millert · Pull Request #81 · onetrueawk/awk
- Don’t prematurely end a regex expr when seeing a slash within a character class by silverneko · Pull Request #136 · onetrueawk/awk
v7 awk
で、ふと気になってV7 UNIXのawkのソース v7unix/v7/usr/src/cmd/awk at master · v7unix/v7unix を見てみたら
v7unix/awk.lx.l at ed636a47207476db76d53b7869447889dee3bbad · v7unix/v7unix
<reg>"[" { BEGIN chc; clen=0; cflag=0; }
<reg>"[^" { BEGIN chc; clen=0; cflag=1; }
省略
<reg>"/" { BEGIN A; unput('/'); }
<reg>\n { yyerror("newline in regular expression"); lineno++; BEGIN A; }
<reg>. { yylval = yytext[0]; RETURN(CHAR); }
省略
<chc>"\\""]" { cbuf[clen++]=']'; }
<chc>"]" { BEGIN reg; cbuf[clen]=0; yylval = tostring(cbuf);
if (cflag==0) { RETURN(CCL); }
else { RETURN(NCCL); } }
<chc>\n { yyerror("newline in character class"); lineno++; BEGIN A; }
<chc>. { CADD; }
省略
startreg()
{
BEGIN reg;
}
そういやlexを使っていたのだっけかこいつは。 ついでにyaccによる文法定義も関係しているのでその部分を。
v7unix/awk.g.y at ed636a47207476db76d53b7869447889dee3bbad · v7unix/v7unix
regular_expr:
'/' { startreg(); }
r '/'
{ PUTS("/r/"); $$ = $3; }
;
r:
CHAR { PUTS("regex CHAR"); $$ = op2(CHAR, (node *) 0, $1); }
| DOT { PUTS("regex DOT"); $$ = op2(DOT, (node *) 0, (node *) 0); }
| CCL { PUTS("regex CCL"); $$ = op2(CCL, (node *) 0, cclenter($1)); }
| NCCL { PUTS("regex NCCL"); $$ = op2(NCCL, (node *) 0, cclenter($1)); }
| '^' { PUTS("regex ^"); $$ = op2(CHAR, (node *) 0, HAT); }
| '$' { PUTS("regex $"); $$ = op2(CHAR, (node *) 0 ,(node *) 0); }
| r OR r { PUTS("regex OR"); $$ = op2(OR, $1, $3); }
| r r %prec CAT
{ PUTS("regex CAT"); $$ = op2(CAT, $1, $2); }
| r STAR { PUTS("regex STAR"); $$ = op2(STAR, $1, (node *) 0); }
| r PLUS { PUTS("regex PLUS"); $$ = op2(PLUS, $1, (node *) 0); }
| r QUEST { PUTS("regex QUEST"); $$ = op2(QUEST, $1, (node *) 0); }
| '(' r ')' { PUTS("(regex)"); $$ = $2; }
;
ん-、この定義だと[
と ]
の間に/
は問題なく置けるような気がするなあ。
というか]
を\
でエスケープできてたのか!