4

我有这个正则表达式:

regex = /(Si.ges[a-zA-Z\W]*avec\W*fonction\W*m.moires)/i

当我在一些(但不是全部)文本上使用它时,例如:

text = "xation de 2 sièges-enfants sur la banquette AR),Pack \"Assistance\",Keyless Access avec alarme : Système de verrouillage/déverrouillage et de démarrage sans clé,Park Assist: Système d'assistance au stationnement en créneauet et en bataille,Rear Assist: Caméra de recul avec visualisation de la zone situ"

像这样:text.match(regex),然后 ruby​​ 只是在看起来像一个无限循环中运行 - 但是为什么呢?并且无论如何要防止这种情况发生,例如让 ruby​​ 抛出异常 - 不使用 ,Timeout因为它是与 Sidekiq 一起使用时的一个已知问题(https://github.com/mperham/sidekiq/wiki/Problems-and -疑难解答#add-timeouts-to-everything

红宝石版本:2.7.2

4

1 回答 1

1

内置字符类更多是由表驱动的。
鉴于此,诸如\W, \Setc...之类的 Negative built-in
引擎很难合并到正字符类中。

在这种情况下,存在一些明显的错误,因为正如您所说,它不会在
某些目标字符串上超时。

事实上,[a-xzA-XZ\W]给定示例字符串的作品。它超时 whenY包含在任何地方
,但仅针对该特定字符串。

让我们看看我们是否可以确定这是否是一个错误。

首先,一些测试:

测试 - 失败 [a-zA-Z\W]

https://rextester.com/FHUQG84843

# Test - Fail  [a-zA-Z\W]
puts "Hello World!";
regex = /(Si.ges[a-zA-Z\W]*avec\W*fonction\W*m.moires)/ui;
text = "xation de 2 sièges-enfants sur la banquette AR),Pack \"Assistance\",Keyless Access avec alarme : Système de verrouillage/déverrouillage et de démarrage sans clé,Park Assist: Système d'assistance au stationnement en créneauet et en bataille,Rear Assist: Caméra de recul avec visualisation de la zone situ";
res = text.match(regex);
puts "Done";

测试 - 通过 [a-xzA-XZ\W]

https://rextester.com/RPV28606

测试 - 通过 [a-zA-Z\P{Word}]

https://rextester.com/DAMW9069


结论:将此报告为 BUG。
IMO这是一个BUG,其内置类\W是引擎定义的,
因为\P{Word}它是Unicode属性定义的函数,而不是范围。
我们看到[a-zA-Z\P{Word}]效果很好。
使用\P{Word}内部类作为临时解决方法。

实际上,当现代引擎首次设计时,每个项目
的负类是什么的逻辑[^]是 AND NOT,当与
每个项目是 ORed 的正类结合使用时,会导致范围错误。
Perl 不久前还有类错误。

于 2022-02-19T01:13:29.523 回答