[英]RegExp match fail in Ruby
我在Ruby中使用聊天機器人時遇到了問題,有一個禁止用戶使用的命令,並且可以像在聊天記錄中一樣工作
!ban [用戶名(用戶名有時可能有空格)] [禁令時間(以秒為單位)] [原因]
喜歡
!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中的“!” 才能在聊天中使用命令
我看到三個問題。 首先,您要匹配“禁止”而不是“!禁止”。 其次,第一個匹配項將匹配整個字符串的其余部分,包括禁止時間和原因。 第三,第二場比賽的模式是錯誤的。 我建議顯式匹配空格以分隔諸如^!ban\\s(.+)\\s(\\d+)\\s(.+)
。
我認為(^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文檔,您可以將它們組合在一起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.