使字符范围Regexp与Ruby 1.9一起工作
这些操作在Ruby 1.8中工作,但我无法使它们在Ruby 1.9中工作:使字符范围Regexp与Ruby 1.9一起工作,ruby,regex,Ruby,Regex,这些操作在Ruby 1.8中工作,但我无法使它们在Ruby 1.9中工作: irb(main):002:0> "Café".match(/[\x80-\xff]/) SyntaxError: (irb):2: invalid multibyte escape: /[\x80-\xff]/ irb(main):003:0> "Café".match(Regexp.new('[\x80-\xff]', nil, 'n')) Encoding::CompatibilityError: i
irb(main):002:0> "Café".match(/[\x80-\xff]/)
SyntaxError: (irb):2: invalid multibyte escape: /[\x80-\xff]/
irb(main):003:0> "Café".match(Regexp.new('[\x80-\xff]', nil, 'n'))
Encoding::CompatibilityError: incompatible encoding regexp match (ASCII-8BIT regexp with UTF-8 string)
如何解决此问题?如果您计划捕获用代码点表示的范围,则需要在utf-8编码头中使用
\u
符号:
#!/bin/env ruby
# encoding: utf-8
puts "Café".match(/[\u0080-\uFFFF]/)
的输出是
é
您可以使用这个/[^\p{ASCII}]/
,它将匹配任何不在/[\x00-\x7F]/
中的内容。您想做什么?您可以这样做:“Café”。强制编码('binary')。匹配(/[\x80-\xff]/n)
–至少它不会引发任何异常,但对于unicode字符串来说它实际上没有多大意义。您的示例与所说的/[^[:ascii:]/
或/[^\p{ascii}]之间有什么区别/
只是为了教化?我自己也问过这个问题。因为这样我们可以修改范围,例如使用子范围[^\p{ASCII}]
是一个集合速记类。这将允许范围操纵,但本质上您当前拥有的内容与包含全部非ASCII字符的内容相同。由于您的答案允许更大的灵活性,我倾向于同意这是对一个模棱两可的问题的最佳答案。有没有一种方法可以同时适用于ruby 1.8和ruby 1.9?我认为这一种方法可以。如果计划只匹配非ASCII,则可以使用已经讨论过的[^\p{ASCII}]
类。