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 - 字符串结尾.| 归档时间: |
|
| 查看次数: |
13049 次 |
| 最近记录: |