如何在%r<…&燃气轮机-Ruby中的分隔regexp?

如何在%r<…&燃气轮机-Ruby中的分隔regexp?,regex,ruby,syntax,syntax-error,regex-lookarounds,Regex,Ruby,Syntax,Syntax Error,Regex Lookarounds,我喜欢%r分隔符,因为它非常容易识别正则表达式的开头和结尾,而且我不必转义任何/。但似乎它们有一个其他分隔符所没有的无法克服的限制 任何其他可以想象的分隔符都可以正常工作: /(?<!foo)/ %r{(?<!foo)} %r[(?<!foo)] %r|(?<!foo)| %r/(?<!foo)/ 好吧,它可能不喜欢这样,它不是一对平衡的,但你如何逃避它,使它喜欢它呢 是否需要转义某些内容? 根据: 任何单个非字母数字字符都可以用作分隔符, %[包括这些]、%?或

我喜欢
%r
分隔符,因为它非常容易识别正则表达式的开头和结尾,而且我不必转义任何
/
。但似乎它们有一个其他分隔符所没有的无法克服的限制

任何其他可以想象的分隔符都可以正常工作:

/(?<!foo)/
%r{(?<!foo)}
%r[(?<!foo)]
%r|(?<!foo)|
%r/(?<!foo)/
好吧,它可能不喜欢这样,它不是一对平衡的,但你如何逃避它,使它喜欢它呢

是否需要转义某些内容?

根据:

任何单个非字母数字字符都可以用作分隔符,
%[包括这些]、%?或这些、%~甚至这些东西
。 通过使用这种表示法,通常的字符串分隔符“和”可以出现 在字符串中,但当然是您选择的新分隔符 确实需要逃跑

事实上,在这些例子中需要逃逸:

%r!(?<\!foo)!                                                             
%r?(\?<!foo)? 

但是,如果您需要插入左侧分隔符({、[、或,正如其他人所提到的,这似乎是一个疏忽,因为这个字符与其他成对的边界有何不同

至于“真的没有办法逃离<这里吗?”有一种方法…但你不会喜欢它:

%r<(?#{'<'}!foo)> == %r((?<!foo))
%r==%r(?

使用插值插入
%r理论上讲,解决特殊对的方法是使用一个分隔符。因为它需要平衡对(未替换)确定结束定界符的位置。否则它的
*>
会带你经过那里。因为,这里没有魔法解析。而且,如果你想一想,只有尖头的定界符会在正则表达式构造中成对使用。所有其他的定界符对都是平衡的。我会避开这一对
很好,我会给出
一次尝试!很少有人会遇到有趣、有挑战性且表达得非常好的问题。干得好!
%r!(?<\!foo)!                                                             
%r?(\?<!foo)? 
%r<(?\<!foo)>
undefined group option: /(?\<!foo)/
%r{(?<!foo{1})}   # repetition quantifier
%r[(?<![foo])]    # character class
%r<(?<name>foo)>  # named capture group
%r{(?<!foo\{)}                                                                  
%r[(?<!\[foo)]
%r<\<foo>
%r<(?\<!foo)>
# undefined group option: /(?\<!foo)/
⟫ ruby -v
ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux]
%r<(?#{'<'}!foo)> == %r((?<!foo))