[英]How to match accented characters with a regex?
我正在運行Ruby on Rails 3.0.10和Ruby 1.9.2。 我使用以下正則表達式來匹配名稱:
NAME_REGEX = /^[\w\s'"\-_&@!?()\[\]-]*$/u
validates :name,
:presence => true,
:format => {
:with => NAME_REGEX,
:message => "format is invalid"
}
但是,如果我試圖保存一些像下面這樣的詞:
Oilalà
Pì
Rùby
...
# In few words, those with accented characters
我有一個驗證錯誤"Name format is invalid.
。
如何更改上面的正則表達式以匹配à
, è
, é
, ì
, ò
, ù
,......等重音字符?
而不是\\w
,使用POSIX括號表達式 [:alpha:]
:
"blåbær dèjá vu".scan /[[:alpha:]]+/ # => ["blåbær", "dèjá", "vu"]
"blåbær dèjá vu".scan /\w+/ # => ["bl", "b", "r", "d", "j", "vu"]
在您的特定情況下,將正則表達式更改為:
NAME_REGEX = /^[[:alpha:]\s'"\-_&@!?()\[\]-]*$/u
不過,這確實不僅僅是重音字符。 這是件好事。 請務必閱讀此博客文章,了解有關軟件應用程序中名稱的常見誤解。
一個解決方案當然是簡單地找到所有這些只是像往常一樣使用它們,雖然我認為它們可以相當多。
如果您使用的是UTF8,那么您會發現這些字符通常分為兩部分,即“基本”字符本身,后跟重音(我相信的0x0300和0x0301),也稱為組合字符。 但是,這可能並非總是如此,因為某些字符也可以使用“硬編碼”字符代碼編寫...因此您需要首先將UTF8字符串規范化為NFD格式。
當然,您也可以將您擁有的任何字符串轉換為UTF8,然后再轉換回原始字符集......但如果您正在進行批量操作,則開銷可能會變得非常大。
編輯:要具體回答你的問題,最好的解決方案是將字符串規范化為UTF8 NPD格式,然后簡單地將0x0300和0x0301添加到可接受字符列表中,以及您想要允許的其他任何組合字符(例如點在åäö中,您可以在Windows中的“charmap”中找到它們,查看0x0300和“up”)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.