Rails使用正则表达式验证格式

时间:2016-11-11 10:09:50

标签: ruby-on-rails regex

在我的rails应用程序中,我想验证包含任意数量关键字的字符串字段的输入(可能超过1个自然语言字(例如“文档编号”))。为了识别单个关键字,我输入它们以“,”分隔(或者以字符串末尾结束)。

为此,我使用

validates :keywords, presence: true, format: { with: /((\w+\s?-?\w+)(,|\z))/i, message: "please enter keywords in correct format"}

应允许属性keywords(字符串)包含:“word1,word2,word3 word4,word5-word6”

不应允许使用任何其他模式。例如不是“word1; word2;” 它错误地允许“word1; word2”

在rubular上,这regex有效;但在我的rails应用程序中它允许例如“word1; word2”或“word3; word - ”

我的错误在哪里(在Ruby和regex中说我是初学者)?

1 个答案:

答案 0 :(得分:9)

您需要使用锚点\A\z并修改模式以适合该逻辑,如下所示:

/\A(\w+(?:[\s-]*\w+)?)(?:,\s*\g<1>)*\z/

请参阅Rubular demo

<强>详情:

  • \A - 字符串开头
  • (\w+(?:[\s-]*\w+)?) - 第1组捕获:
    • \w+ - 一个或多个单词字符
    • (?:[\s-]*\w+)? - 1或0个序列:
      • [\s-]* - 0+空格或-
      • \w+ - 一个或多个单词字符
  • (?:,\s*\g<1>)* - 0个或更多序列:
    • ,\s* - 逗号和0+空格
    • \g<1> - 与第1组相同的模式
  • \z - 字符串结束。