Bug #9693
closed\x{} in regexp
Description
https://github.com/rurema/doctree/issues/80 の話です。
regparse.c の OnigSyntaxRuby では ONIG_SYN_OP_ESC_X_BRACE_HEX8 が有効になっていて、使えることを意図しているように見えるのですが、正規表現リテラルだと parser が通してくれなくて syntax error, unexpected '{', expecting end-of-input になるようです。
Regexp.new に直接渡しても re.c の中で invalid hex escape になるので使えないようです。
        
           Updated by naruse (Yui NARUSE) over 11 years ago
          Updated by naruse (Yui NARUSE) over 11 years ago
          
          
        
        
      
      - Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN to 2.0.0: DONTNEED, 2.1: DONTNEED
なぜ OnigSyntaxRuby に ONIG_SYN_OP_ESC_X_BRACE_HEX8 が含まれているのか謎ですが、
挙動・仕様としてはそのままでいいんじゃないでしょうか。
"\x{a}" も許されてないし。
また、これを外したからといって最適化で消えるようになる気もあんまりしないので、気分の問題ですかねぇ。
消してもいいとは思うのでコミットしたい場合はしてくださいですが、した場合はupstreamへの反映をよろしくお願いします。
https://github.com/k-takata/Onigmo/tree/tmp/ruby-2.0.x
        
           Updated by mame (Yusuke Endoh) almost 6 years ago
          Updated by mame (Yusuke Endoh) almost 6 years ago
          
          
        
        
      
      - Status changed from Open to Rejected
"\x{00000020}" も書けないわけなので、とりあえず現行の挙動は意図的であると考えます。逆に、/\x{00000020}/ を許すなら "\x{00000020}" も許さねば、ってことになるのではないでしょうか。そういう仕様変更に意見はないですが、Bug ではなかろうということで閉じます。
ONIG_SYN_OP_ESC_X_BRACE_HEX8 は実装詳細なんで、直したかったら成瀬さんの言うとおりにするか、もしくはupstreamを直してもらってからバックポートするのが良さそうな気がします。