2014-03-03 54 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

相關問題