gpt4 book ai didi

ruby - 正则表达式 "empty range in char class error"

转载 作者:数据小太阳 更新时间:2023-10-29 06:38:00 24 4
gpt4 key购买 nike

我的代码中有一个正则表达式,用于匹配 url 的模式并抛出错误:

/^(http|https):\/\/([\w-]+\.)+[\w-]+([\w- .\/?%&=]*)?$/

错误是“字符类错误中的空范围”。我发现原因在 ([\w- .\/?%&=]*)? 部分。 Ruby 似乎将 \w-. 中的 - 识别为范围运算符,而不是文字 -。给dash加上escape后问题解决。

但原来的正则表达式在我同事的机器上运行良好。我们使用相同版本的osx、rails和ruby:Ruby版本是ruby 1.9.3p194,rails是3.1.6,osx是10.7.5。在我们将代码部署到我们的 Heroku 服务器之后,一切都运行良好。为什么只有我的环境有关于这个正则表达式的错误? Ruby 正则表达式的解释机制是什么?

最佳答案

我可以在使用 rvm 1.13.4 安装在 Ubuntu 12.04.1 LTS 上的 Ruby 1.9.3p194(2012-04-20 修订版 35410)[i686-linux] 上复制此错误。但是,这不应该是特定于版本的错误。事实上,令我惊讶的是它在其他机器上也能正常工作。

一个同样失败的更简单的演示:

"abcd" =~ /[\w- ]/

这是因为 [\w- ] 被解释为“以任何单词字符开始到空格(或空白)”的范围,而不是包含单词、连字符、或一个空间,这是你想要的。

Per Ruby's regular expression documentation :

Within a character class the hyphen (-) is a metacharacter denoting an inclusive range of characters. [abcd] is equivalent to [a-d]. A range can be followed by another range, so [abcdwxyz] is equivalent to [a-dw-z]. The order in which ranges or individual characters appear inside a character class is irrelevant.

如您所见,在前面加上一个反斜杠可以转义连字符,从而将正则表达式的性质从一个范围更改为一个字符类,从而消除了错误。但是,不建议转义字符类中间的连字符,因为在这种情况下很容易混淆连字符的预期含义。正如 m.buettner 指出的那样,始终将连字符放在字符类的开头或结尾:

"abcd" =~ /[-\w ]/

关于ruby - 正则表达式 "empty range in char class error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13161903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com