Ruby正则表达式错误:不兼容的编码regexp match(ASCII-8BIT regexp与UTF-8字符串)

24

我遇到了两个错误,都与编码有关,而且它们之间存在联系。

第一个错误(严格来说是警告)出现在启动WEBrick时:

/Users/USERNAME/example/config/initializers/bb-ruby.rb:54: warning: invalid Unicode Property \P: /\:\-?\P/

它所指的那一行代码是:/\:\-?\P/

它只是一个正则表达式的一部分,最终用于这个块:

@@tags['Razzing'] = [
  /\:\-?\P/,
  '<img src="/assets/emoticons/razzing.png">',
  'Razzing',
  ':P',
  :razzing]

然后,当解析一些字符串时(可能是由于相同的行),我也会遇到以下错误...

Encoding::CompatibilityError
incompatible encoding regexp match (ASCII-8BIT regexp with UTF-8 string)

我正在运行 Ruby 1.9.2 和 Rails 3.2.1。

2个回答

27

你的正则表达式被编译为ASCII-8BIT。

只需在声明正则表达式的文件顶部添加编码声明:

# encoding: utf-8

完成了。现在,当Ruby解析您的代码时,它会假定您使用的每个文字(Regex、字符串等)都是以UTF-8编码指定的。

更新:UTF-8现在是Ruby 2.0及以上版本的默认编码。


2
正则表达式引擎在 Ruby 1.9 上发生了变化...我不知道你最初所指的 \P 是什么意思,但现在它用于匹配 Unicode 代码点,并且需要一个参数(例如 \P{L},用于匹配任何非字母字符)。请参见:http://www.regular-expressions.info/unicode.html - Fábio Batista
实际上,在表达式中,您不需要任何反斜杠。请记住,它仅用于转义对正则表达式有意义的字符,例如:([{(及其相应的闭合符号)、^$\本身。 - Fábio Batista
regex_string = ...从json文件中读取... # 示例值: "^MatchPod/" regex = Regexp.new(regex_string)对于我的情况,有什么办法解决这个问题吗?在我的情况下添加声明是否也能解决问题? - knagode
1
@knagode 我建议您为您的情况开一个新的、写得很好的问题。在评论部分帮助是非常困难的。 - Fábio Batista
1
@knagode我建议您为您的情况提出一个新的、写得很好的问题。在评论部分帮助起来非常困难。 - Fábio Batista
显示剩余3条评论

5

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