ruby - Ruby lookbehind 断言 (1.9/2.0) 中是否存在错误?

标签 ruby regex lookbehind

为什么正则表达式不 (?<=fo).*匹配foo (而 (?<=f).* 是)?

"foo" =~ /(?<=f).*/m          => 1
"foo" =~ /(?<=fo).*/m         => nil

这似乎只在打开单行模式时发生(点匹配换行符);没有它,一切正常:

"foo" =~ /(?<=f).*/           => 1
"foo" =~ /(?<=fo).*/          => 2

在 Ruby 1.9.3 和 2.0.0 上测试。

See it on Rubular

编辑:更多观察:

添加行尾 anchor 不会改变任何东西:

"foo" =~ /(?<=fo).*$/m        => nil

但是与惰性量词一起,它“有效”:

"foo" =~ /(?<=fo).*?$/m       => 2

编辑:还有一些观察结果:

.+与其等价物一样工作 {1,}但仅限于 Ruby 1.9(在这种情况下,这似乎是两者之间唯一的行为差异):

"foo" =~ /(?<=fo).+/m         => 2
"foo" =~ /(?<=fo).{1,}/       => 2

在 Ruby 2.0 中:

"foo" =~ /(?<=fo).+/m         => nil
"foo" =~ /(?<=fo).{1,}/m      => nil

.{0,}被破坏(在 1.9 和 2.0 中):

"foo" =~ /(?<=fo).{0,}/m      => nil

但是{n,m}适用于:

"foo" =~ /(?<=fo).{0,1}/m     => 2
"foo" =~ /(?<=fo).{0,2}/m     => 2
"foo" =~ /(?<=fo).{0,999}/m   => 2
"foo" =~ /(?<=fo).{1,999}/m   => 2

最佳答案

这已被正式分类as a bug and subsequently fixed ,以及另一个有关多行字符串中的 \Z anchor 的问题。

关于ruby - Ruby lookbehind 断言 (1.9/2.0) 中是否存在错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15234078/

相关文章:

python - 如何编写 if-then-else 正则表达式?

javascript - 如何使用后向和前向零长度断言提取括号内的字符串?

ruby - ruby Set.include 中的性能异常?带有符号(2.2.2 与 2.1.6)

ruby - 删除逗号和空格 ruby

html - 是否可以在 CSS 中使用通配符来执行正则表达式以创建更少的代码?

java - 转义时如何使用 CSV 拆分\

Ruby 将范围测量字符串转换为测量列表?

ruby-on-rails - 批量导入数据有没有比ActiveRecord更好的解决方案?

C# Regex - 循环遍历文本框?

regex - R:可变宽度lookbehind的解决方法