簡體   English   中英

如何將重音字符與正則表達式匹配?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM