【问题标题】:Regular Expression for excluding numbers or special characters用于排除数字或特殊字符的正则表达式
【发布时间】:2014-10-08 19:57:24
【问题描述】:

我正在 Rails 中设置一个需要名字和姓氏的用户表单。我决定使用 Ruby doc 中倒数第三个正则表达式,以确保它们不输入任何数字或特殊字符。不幸的是,当我返回表单时出现此错误:

提供的正则表达式使用多行锚(^ 或 $), 这可能会带来安全风险。您的意思是使用 \A 和 \z,还是 忘记添加 :multiline => true 选项了?

我刚刚开始学习 RegEx,所以如果有更好的方法来编写此验证,我会全力以赴。

代码:

validates :first_name, :last_name, length: {minimum: 2}, format: {with: /^([^\d\W]|[-])*$/, message: 'First Name/Last Name cannot have any numbers or special characters'}

【问题讨论】:

  • 警告非常明确。它告诉您,您在多行正则表达式上使用锚点作为行首和行尾,但没有说它将在单行上工作,其中\A 优于^\z 在单行中优于$查看。所以使用/\A([^\d\W]|[-])*\z/ 形式的正则表达式它会起作用,您可以在regex101.com 进行测试,它会为您解释正则表达式的锚点/部分。

标签: ruby-on-rails ruby regex forms


【解决方案1】:

您链接到的文档指出:

注意:使用 \A 和 \Z 匹配字符串的开始和结束,^ 和 $ 匹配行的开始/结束。

由于您不需要名称的多行支持(即名称中的换行符应被视为无效),您可以安全地将其更改为:

/\A([^\d\W]|[-])*\Z/

另请参阅this answer,它更详细地解释了安全风险。

【讨论】:

    【解决方案2】:

    出于安全原因,您将需要使用\A 作为行首,\z 作为行尾,而不是^$。所以你的正则表达式应该是

    /\A([^\d\W]|[-])*\z/
    

    【讨论】:

      猜你喜欢
      • 2018-10-11
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多