正则表达式中的奇怪之处

时间:2016-06-22 06:42:28

标签: ruby regex

当我在rubular.com练习时,我试图匹配一个正则表达式,检查一个单词是否以非辅音开头。我的方法是检查案例如何以非字母开头,或以数字或下划线开头,或检查空字符串 我发现了一个奇怪的行为:

我的正则表达式/^[aeiou_0-9\W]|^$/iks辅音相匹配!我不明白为什么。

有什么想法吗?

指向示例的链接 - > http://rubular.com/r/0zt0VPmcwr

2 个答案:

答案 0 :(得分:3)

在某些版本中,这是Ruby正则表达式中的一个错误。在下拉列表中选择版本1.8.7,您将看到正则表达式正常工作。

编辑。查看http://ruby-doc.org/core-2.1.5/Regexp.html处的文档。更具体地说,在元字符部分:

  • / \ W / - 非单词字符([^ a-zA-Z0-9_])。如果使用/ \ W /和/ i修饰符,请查看Bug #4044

答案 1 :(得分:3)

这非常有趣,因为当你使用\ W和/ i(它就像一场完美的风暴)时,你偶然发现了一个专门针对字母k和s的bug。

以下是解释错误的链接:https://bugs.ruby-lang.org/issues/4044

也许这是在更新版本的ruby中修补的,但是如果你不想经历一个新版本的ruby的麻烦,那么你可以明确地制作一个所有的反转角色类辅音:

/^[^bcdfghjklmnpqrstvwxyz]|^$/i

以下是rubular链接:http://rubular.com/r/URgsWP3suQ

编辑: 所以,我注意到你的正则表达式的其他一些东西是你的正则表达式(和我上面提供的正则表达式)只匹配单词的第一个字母,因为我提供的正则表达式匹配整个单词。我不知道这对你有什么影响,但我觉得值得指出。请参阅上面的rubular链接和下面的一个突出显示的区别(请参阅上面的链接如何突出显示单词的第一个字母,其中下面的链接突出显示整个单词):

^[^bcdfghjklmnpqrstvwxyz].*|^$

http://rubular.com/r/IVJ03uOK4h