Ruby中非ASCII字符范围检查的正则表达式

时间:2014-03-03 02:35:14

标签: ruby-on-rails ruby regex

我想分割不是ASCII格式的字符,即UTF-8。 我写了这行代码

result = string.scan(/[\x0600-\x06ff]/)

不知怎的,它不起作用,并给出错误

"empty range in char class : /[\x0600-\x06ff]/".

我只是想检查一个角色是否属于正则表达式的范围。如果是这样,那就把它分开。

2 个答案:

答案 0 :(得分:3)

您的问题是您错误地使用了\x\xHH以十六进制指定HH的字节。这意味着\x0600实际上是\x0600,并且您的整个角色类看起来像(用空格来分隔部分):

\x06 0 0-\x06 f f

唯一的范围是0-\x06,这不是你想要的。如果要按十六进制值指定Unicode,则需要使用\u

/[\u0600-\u06ff]/

此外,您的范围错过了很多非ASCII值(例如'µ' \u00b5),您最好使用Vasili's /[^[:ascii:]]/ POSIX命名字符类或/[^\p{ASCII}]/

答案 1 :(得分:1)

Ruby在它的regex 的实现中不支持Unicode令牌(或者我的RegexBuddy告诉我谎言)

如果我尝试\u0000,我会收到一条错误消息,说明它不受支持 如果您的Ruby版本支持它,则范围为[\u0000-\uFFFF]

您可以尝试使用POSIX类[^[:ascii:]]来匹配非ASCII的所有内容 您也可以尝试[^\x00-\xFF]来匹配没有小数值0-255的所有内容。