2014-03-03 79 views
0

我想分割不是ASCII格式的字符,即UTF-8。 我写这行代码Ruby中非ASCII字符范围检查的正则表达式

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

不知怎么就不能正常工作,并给出错误

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

我只是想检查,如果一个角色落在正则表达式的范围。如果是这样,然后分开。

+0

我不能使用它,因为我必须**检查字符是否落在给定范围内**。如果是,然后分割它。 – ZeeAzmat

+0

我的任务不是检查每个非ASCII字符。 我想检查的范围在问题0600-06ff – ZeeAzmat

回答

1

红宝石不支持Unicode令牌在它的正则表达式执行的(或我使用RegexBuddy告诉我的谎言)

如果我尝试\u0000我得到的说,这是不支持的错误。
如果你的Ruby版本不支持它,范围为[\u0000-\uFFFF]

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

+0

'\ uHHHH'用于指定Unicode的十六进制值,但对于':ascii:'指定Unicode。 –

3

你的问题是你错误地使用了\x\xHH指定十六进制为HH的字节。这意味着,\x0600实际上是\x060,并且0和你的整个人物类是什么样子(用空格部分分开):

\x06 0 0-\x06 f f 

,唯一的范围是0-\x06这不是你想要的。如果你想通过十六进制值,以指定的Unicode,那么你要使用\u

/[\u0600-\u06ff]/ 

而且,你的范围错过了很多非ASCII值(如'µ'这是\u00b5),你会更好off使用Vasili's/[^[:ascii:]]/ POSIX命名字符类或/[^\p{ASCII}]/

+0

我想要这个来计算Unicode字符的数量 但是这个正则表达式不起作用,它总是在其他部分。你能发现问题吗? '如果unicode.match(/ [\ u0600- \ u06ff] /) unicodeChars + = 1个 否则 asciiChars + = 1个 end' – ZeeAzmat

+0

是什么'unicode'样子?为什么不使用Vasili的'[^ [:ascii:]]'正则表达式呢?你的0x0600到0x06ff范围没有找到合适的位(例如''μ''这是'\ u00b5'。 –

+1

在上面的代码中** unicode有4位十六进制数**,我之所以没有使用[^ [ ascii:]]是我必须检查多少文件是在** urdu **和多少是英文。所以为了检查我必须比较给定范围内的每个字符。因为有很多其他unicode字符。如果我使用[^ [:ascii:]]作为正则表达式,那么除了urdu之外的其他unicode字符也会在count中存在。所以**乌尔都语**字符unicode范围是从0600-06ff – ZeeAzmat

相关问题