Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使字符范围Regexp与Ruby 1.9一起工作_Ruby_Regex - Fatal编程技术网

使字符范围Regexp与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

这些操作在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: 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}]
类。