Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将重音字符与正则表达式匹配?_Ruby On Rails_Ruby_Regex_Ruby On Rails 3_Pattern Matching - Fatal编程技术网

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

Ruby on rails 如何将重音字符与正则表达式匹配?,ruby-on-rails,ruby,regex,ruby-on-rails-3,pattern-matching,Ruby On Rails,Ruby,Regex,Ruby On Rails 3,Pattern Matching,我正在运行RubyonRails3.0.10和Ruby1.9.2。我使用以下正则表达式来匹配名称: NAME_REGEX = /^[\w\s'"\-_&@!?()\[\]-]*$/u validates :name, :presence => true, :format => { :with => NAME_REGEX, :message => "format is invalid" } 但是,如果我试图保存一

我正在运行RubyonRails3.0.10和Ruby1.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
我有一个验证错误
“名称格式无效。


我如何更改上面的正则表达式以匹配重音字符,如
a
è
ì
ò
ù
,…?
一个解决方案当然是简单地找到所有这些字符,就像您通常使用它们一样,尽管我认为它们可能相当多。

如果您使用UTF8,您会发现这些字符通常分为两部分,“基本”字符本身,后跟重音(我相信是0x0300和0x0301),也称为组合字符。但是,这可能并不总是正确的,因为有些字符也可以使用“硬编码”字符写入“字符代码。。。因此,首先需要将UTF8字符串规范化为NFD格式

当然,您也可以将任何字符串转换为UTF8,然后再转换回原始字符集。。。但是,如果您执行批量操作,开销可能会变得相当大


编辑:为了具体回答您的问题,最好的解决方案可能是将字符串规范化为UTF8 NPD格式,然后简单地将0x0300和0x0301添加到可接受的字符列表中,以及您希望允许的任何其他组合字符(如åäö中的点,您可以在“charmap”中找到它们)在Windows中,查看0x0300和“up”)。

使用
[:alpha://code>,而不是
\w

"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
不过,这种匹配不仅仅是重音字符。哪一个是 好东西。确保你读到了一些常见的误解
关于软件应用程序中的名称。

那么,为了实现我的目标,我应该做些什么?怎么做呢?我编辑了我的答案,对你的具体案例做了简短的解释,看看是否有帮助。否则,请重新评论。如果您想稍微宽容一点,并且不太担心用户滥用奇怪的名称,只需将0x0300-0x036F添加到您的字符列表中,这将包括所有组合字符。此外,根据您的特定用途,您可能只需在正则表达式中使用unicode字符属性即可,我不确定他们在你的语言中是怎么看的,但是在PHP中,你可以写“PL”,它会接受任何语言中的任何“字母”(同样,可以打开故意的滥用,有很多信,你可能不会认为是一封信)。鉴于我不能对下面的答案发表评论,请注意unicode字符属性,例如[:alpha:],它们匹配“åäö”,但它们也很匹配”ﻩﻷﻼ﷼ﮬ₳ᵭᵰݡᴃ" 奇怪的是,如果你在命令行中这样做,它会起作用:
irb(main):019:0>“láasdasd”。scan/^[\w\s'\-\-\&!?()\[\]-]*$/u=>[“l\303\240asdasd”]
;如果省略unicode修饰符则无效。您能告诉我如何在正则表达式中准确使用“[:alpha:]”吗?只需在正则表达式中将
\w
替换为
[:alpha://code>。实际上,\w应该替换为[:alnum:]。如果您想匹配不是字母数字字符的字符,只需将[^\w]替换为[[:^alnum:][]即可。我无法使用Ruby 2.2.2使用
[:alpha:][/code>,但能够使用
\p{alpha}
。请参阅Ruby
Regexp
字符属性。但是为什么不匹配?在我看来,regex的实现很糟糕。