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

Dim*_*ter 8 regex ruby-on-rails

在我的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,这个正则表达式工作; 但在我的rails应用程序中它允许例如"word1; word2"或"word3; word-"

我的错误在哪里(在Ruby和正则表达式中说我是初学者)?

Wik*_*żew 11

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

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

请参阅Rubular演示

细节:

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