如何将重音字符与正则表达式匹配?

时间:2011-09-03 09:51:27

标签: ruby-on-rails ruby regex ruby-on-rails-3 pattern-matching

我正在运行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.

如何更改上述正则表达式以匹配àèéìò等重音字符, ù,...?

2 个答案:

答案 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”)。