【问题标题】:Rails regex won't work, but Javascript regex doesRails 正则表达式不起作用,但 Javascript 正则表达式可以
【发布时间】:2014-12-24 17:53:52
【问题描述】:

我已阅读此问题并相应地更改了我的 Rails 模型代码: Regular expressions with validations in RoR 4

这是我在 Rails 中的日期时间的正则表达式:

/\A((19[7-9][0-9])|(2[0-9][0-9][0-9]))\/((0[1-9])|(1[0-2]))\/(([0-2][0-9])|(3[0-1]))\s(([0-1][0-9])|(2[0-4]))\:([0-5][0-9])\z/

下面的这个正则表达式可以在 javascript 中使用:

/^((19[7-9][0-9])|(2[0-9][0-9][0-9]))\/((0[1-9])|(1[0-2]))\/(([0-2][0-9])|(3[0-1]))\s(([0-1][0-9])|(2[0-4]))\:([0-5][0-9])$/

我正在尝试将日期时间字符串传递给他们两个,但我不明白为什么它总是失败。这是字符串:

2014/12/02 11:06

我认为我的模型代码可能会有所帮助:

validates :start, presence: true, format: { :with => /\A((19[7-9][0-9])|(2[0-9][0-9][0-9]))\/((0[1-9])|(1[0-2]))\/(([0-2][0-9])|(3[0-1]))\s(([0-1][0-9])|(2[0-4]))\:([0-5][0-9])\Z/, :message => "must be in this format: YYYY/MM/DD HH:MM" }
validates :finish, presence: true, format: { :with => /\A((19[7-9][0-9])|(2[0-9][0-9][0-9]))\/((0[1-9])|(1[0-2]))\/(([0-2][0-9])|(3[0-1]))\s(([0-1][0-9])|(2[0-4]))\:([0-5][0-9])\Z/, :message => "must be in this format: YYYY/MM/DD HH:MM" }

编辑:我知道问题出在哪里,但我仍然不知道如何解决它...

由于某种原因,当我提交表单时,日期 2014/12/24 16:19 被缩短为 2014。然后验证失败并引发错误。

谁能帮我解决这个问题?

【问题讨论】:

  • 您的 ruby​​ 正则表达式是正确的,并且与提供的字符串匹配
  • 为我工作:rubular.com/r/FoRXQm9t4H
  • @August 我认为我的 text_fields 可能会在字符串末尾添加一个新行。我尝试在您提供的代码中添加换行符,但失败了。有没有办法在提交之前去掉换行符?
  • 我认为 Rails 出于某种原因正在将我的输入减少到一年。不过我不知道为什么
  • 我发现了问题:在验证之前,我的日期时间被缩短到一年(或我假设的第一个“/”之前的任何时间)。谁能告诉我为什么会发生这种情况以及如何解决它?

标签: javascript ruby-on-rails regex


【解决方案1】:

您的 regexp 用于 ruby​​ 部分是正确的,它与提供的字符串匹配:

re = /\A((19[7-9][0-9])|(2[0-9][0-9][0-9]))\/((0[1-9])|(1[0-2]))\/(([0-2][0-9])|(3[0-1]))\s(([0-1][0-9])|(2[0-4]))\:([0-5][0-9])\z/
'2014/12/02 11:06' =~ re # => 0 

一些注意事项

  1. 请参阅 SO 主题 123,了解如何匹配 ruby 中的日期。

  2. 使用正则表达式在线服务rubular.comrubyxp.com 验证正则表达式匹配ruby 语言、嵌入式 应用程序或调试 gem。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2015-06-19
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多