Ruby中的RegExp匹配失败

时间:2016-09-18 23:23:56

标签: ruby regex

我在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行中的"!"命令在聊天中工作是必需的

2 个答案:

答案 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文档,您可以将它们拼凑在一起。