簡體   English   中英

Ruby中的RegExp匹配失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM