【问题标题】:rails regular expression validation string escaperails 正则表达式验证字符串转义
【发布时间】:2013-08-23 11:53:26
【问题描述】:

我的模型中有一个由

验证的名称属性
validates :name ,format:{with: /^[\p{L} \.'\-]+$/ , message: "invalid name" }

创建模型对象时发现以下语法错误

SyntaxError (basic_info.rb:8: invalid  property name {L}: /^[\p{L} \.'\-]+$/

显然 Ruby 正在尝试在未定义的正则表达式中评估 {L}。在正则表达式中插入转义字符也会使其无效。

【问题讨论】:

  • 尝试\p{L} 而不是\p\{L}
  • 如果您展示一个有效名称的示例会有所帮助,这样我们就知道您要做什么。此外,您的错误中的正则表达式与上面的不一样。
  • 我在 www.rubular.com 上尝试了正则表达式。它工作正常。任何只有字母的名字都可以。
  • 我不知道 ruby​​,但\pL 在 perl 中是正确的。你试过不戴牙套吗?
  • No \pL 在 Ruby 中似乎不起作用。

标签: ruby-on-rails ruby regex validation


【解决方案1】:

编辑:根据this post,这与编码有关。 Ruby 2.0.0 之前的版本,ruby 脚本的默认编码不是 Unicode,因此在使用 unicode 字符属性正则表达式模式时会出现问题(例如\p{L}!)。

您需要将神奇的# encoding: utf-8 注释放在文件顶部。


我刚刚做了一个快速的 IRB 测试,但你是否有机会使用 Ruby 1.8.7?

在 1.8.7 中:

>> "blah".match(/^[\p{L} \.'\-]+$/)
=> nil

在 2.0.0 中:

>> "blah".match(/^[\p{L} \.\-']+$/)
=> #<MatchData "blah">

似乎 1.8.7 Regexp 不支持 unicode 字符属性?考虑改用/^[a-zA-Z \.'\-]+$/

【讨论】:

  • 不,但我尝试了"blah".match(/^[\p{L} \.\-']+$/),它按预期返回#&lt;MatchData "blah"&gt;。我不明白为什么 Rails 在创建时会抛出验证错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多