我在Ruby中遇到了一个聊天机器人的问题,这是一个禁止用户的命令,它可以像写聊天一样工作
!ban [用户名(用户名有时可能包含空格)] [以秒为单位的禁令长度] [原因]
像
!禁止Chara Cipher 3600制作 洪水
,代码就像
match /^ban (.*)(^0-9) (.+)/, :method => :ban
# @param [User] user
# @param [String] target
# @param [Integer] length
# @param [String] reason
def ban(user, target, length, reason)
if user.is? :mod
@client.ban(target, length, reason)
@client.send_msg "#{target} ha sido baneado gracias a la magia de la amistad."
end
end
问题是参数不能与每个字符串正确匹配,可能是因为正则表达式匹配部分(.*)(^0-9) (.+)
。
有人知道如何修复它吗?
更新 https://gist.github.com/carlosqh2/b926e59772e3c28d104d756589acc75e#file-admin-rb-L213 来自Admin.rb的第214,255-263行和来自client.rb的第188行是最相关的行,也是来自Admin.rb的第202-213行中的"!"命令在聊天中工作是必需的
答案 0 :(得分:1)
我看到的三个问题。首先,你要匹配'禁止'没有'!禁止'。其次,第一场比赛将匹配整个字符串的其余部分,包括禁令和理由的时间。第三,第二场比赛的模式是错误的。我建议显式匹配空格来分隔像^!ban\s(.+)\s(\d+)\s(.+)
这样的参数。
答案 1 :(得分:0)
我认为(^0-9)
不符合你的想法。在正则表达式中,它意味着“在当前行的开头捕获文字字符'0-9'。
默想:
" 0-9"[/(^0-9)/] # => nil
"0-9"[/(^0-9)/] # => "0-9"
" \n0-9"[/(^0-9)/] # =>
"0-9"
最后一行与新行和0-9
匹配并返回,导致输出落在下一行。
相反,你可能想要[^0-9]
,这意味着“一个不是0-9的字符”,并且会在字符串中间正确匹配:
" 0-9"[/[^0-9]/] # => " "
"0-9"[/[^0-9]/] # => "-"
" \n0-9"[/[^0-9]/] # => " "
阅读Regexp文档,您可以将它们拼凑在一起。