在我的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中说我是初学者)?
答案 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
- 字符串结束。