Ruby正则表达式中的“反斜杠R”或“\ R”模式。

6

我很确定我在某处看过“\R是Ruby2中引入的,用于匹配换行符,无论它们来自哪里:Unix的\n、macOS的\r或Windows的\r\n。”。也就是说,Ruby2应该将\R视为%r{\r\n|\r|\n}

这个工作得很好:

▶ "a\nb".match /\R/
#⇒ #<MatchData "\n">
▶ "a\rb".match /\R/
#⇒ #<MatchData "\r">
▶ "a\r\nb".match /\R/
#⇒ #<MatchData "\r\n">

即使换行符/回车符被合并,也可以正常工作:
▶ "a\r\n\nb".match /\R{2}/
#⇒ #<MatchData "\r\n\n">

除非试图否定 \R:
▶ "a\nb".match /[^\R]+/
#⇒ #<MatchData "a\nb">

不过,否定 \n 是可以的:

▶ "a\nb".match /[^\n]+/
#⇒ #<MatchData "a">

很遗憾,\R 在谷歌上搜索非常困难。无论是Regexp rdoc还是正则表达式都没有提到它。
有没有任何正则表达式大师在这里解释一下,以便更容易地搜索到呢?
提前感谢。

1
阅读了@sawa的解释后,我觉得这可能是一个bug。在我看来,"a\nb".match /[^\R]+/应该按照你的期望工作。我给K. Takata发了一封电子邮件,请他/她查看你的问题。 - Cary Swoveland
@CarySwoveland 谢谢你。另一方面,我认为原子表达式的分离不容易被否定。我们不应该期望非文字在方括号内正确运行,就像我们不期望反向引用(具有几乎相同的符号)在字符分组内正常工作一样。 - Aleksei Matiushkin
1个回答

5

这是作者的原话:https://github.com/k-takata/Onigmo/blob/master/doc/RE#L101。它表示

\R       Linebreak

         Unicode:
           (?>\x0D\x0A|[\x0A-\x0D\x{85}\x{2028}\x{2029}])

         Not Unicode:
           (?>\x0D\x0A|[\x0A-\x0D])

对于你的问题,这里看起来具有相关性的是它不是一个字符组,而是一系列备选项。考虑到该序列不一定是单个字符,我猜它不能被转换成字符组。这可能与否定符号产生了特殊的交互作用,否定符号仅应与字符和/或字符组一起使用。


谢谢,这个参考资料正是我所缺失的。您能否更新您的参考资料以包括行锚点:https://github.com/k-takata/Onigmo/blob/master/doc/RE#L101 - Aleksei Matiushkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接