我正在运行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.
。
如何更改上述正则表达式以匹配à
,è
,é
,ì
,ò
等重音字符, ù
,...?
答案 0 :(得分:55)
而不是\w
,请使用POSIX bracket expression [: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
但这不仅仅与重音字符相匹配。这是一个 好事。请务必阅读this blog entry有关常见误解的信息 关于软件应用程序中的名称。
答案 1 :(得分:0)
一个解决方案当然是简单地找到所有这些只是像往常一样使用它们,虽然我认为它们可以相当多。
如果您使用的是UTF8,那么您会发现这些字符通常分为两部分,“基本”字符本身,后跟重音(我相信的0x0300和0x0301),也称为组合字符。但是,这可能并非总是如此,因为某些字符也可以使用“硬编码”字符代码编写...因此您需要首先将UTF8字符串规范化为NFD格式。
当然,您也可以将您拥有的任何字符串转换为UTF8,然后再转换回原始字符集......但如果您正在进行批量操作,开销可能会变得非常大。
编辑:要具体回答您的问题,最好的解决方案是将字符串规范化为UTF8 NPD格式,然后简单地将0x0300和0x0301添加到您可接受的字符列表中,以及您想要允许的任何其他组合字符(例如作为åäö中的点,您可以在Windows中的“charmap”中找到它们,查看0x0300和“up”)。