iT邦幫忙

1

稍微看了一下工程師們的文章,想問一下關於 regexp的問題。

  • 分享至 

  • xImage

先前的問題是想利用regexp規則,讓LINE BOT抓取整句話的特定關鍵字。

之後測試發現,如果LINE@後台設立關鍵字A,再利用程式語言判斷關鍵字A。
當有人發送關鍵字A的消息給BOT,就會收到兩種回應。(LINE@後台設立的回應與程式語言判斷的回應不同。)

如果我利用regexp的規則,想詢問有哪位工程師,願意手把手教我這個完全的外行人……
爬了幾篇跟regexp有關的文章,我看得一頭霧水。(是真的完全沒有概念)

有看到這篇基礎教學,但因為內部敘述使用的是英文,不知道使用中文會否有所影響。
然後我完全看不懂C++跟JAVA是什麼意思……只知道應該類似於語法版本?
卡米狗的語言是哪個版本,有工程師前輩知道嗎?

想請問各位工程師,如果我接續卡米狗作者LINE BOT製作教學文章內的程式語言,來接續這位工程師的regexp規則。
兩者間會有衝突嗎?

因為使用的是不同的平台,我並不需要使用者可以「搜尋關鍵字」。
而且我是完全0概念的門外漢,有點好奇有沒有願意花時間的工程師,可以教學?
而且這個教學可能會花很長一段時間……

我只是想學一段regexp規則而已。
但不知道還會牽扯到什麼語法,所以不知道會不會太麻煩。

雖然我很清楚這個要求很失禮,也很不切實際。
但總歸是有問總比沒問好……(抹臉

先謝謝願意看完這篇文章的工程師。

更新一下。
有看到前輩們回應跟回答的內容了。

目前仍然是一頭霧水當中。
如果我在回應上,讓您有鬼打牆的感覺,請多包涵。

我先研究一下卡米大提供的網站
謝謝各位前輩。

看更多先前的討論...收起先前的討論...
weiclin iT邦高手 4 級 ‧ 2018-11-01 02:04:47 檢舉
你要跟著卡米狗做的話, 去學習 Ruby 這個語言吧
ccutmis iT邦高手 2 級 ‧ 2018-11-01 10:14:51 檢舉
你在文裡提到跟LINEBOT無關想學的是REGEXP,個人REGEXP也是自學學會的,這裡提供一些心得,首先REGEXP是個易學難精的東西,它的用途很廣,但簡化來說就是個字串選取器,例如有段文章:
aAa123456AbBc32323C
你用 a*A 作 REGEXP搜的條件就會得到
aA 跟 a123456A
換成用 a+A 作 REGEXP搜的條件就會得到
a123456A

網路上的教學文章很多,你多找幾篇找到能看懂的把它完整讀兩三遍就懂了。例如鳥哥的教學就很不錯:
http://linux.vbird.org/linux_basic/0330regularex.php

https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Guide/Regular_Expressions

有概念後最重要的是練習,練REGEX比寫程式容易太多了,例如安裝Notepad++ 然後用它開啟一篇文章或一個.htm網頁檔,按下Ctrl+F(搜尋) 裡面的搜尋模式設爲"規則運算式",就能直接練習了。

前面有提到REGEXP是易學難精的,網路上有很多範例供你參考,在Google搜尋"Regexp example",祝您學有所成。
韓寶寶 iT邦新手 5 級 ‧ 2018-11-01 12:49:57 檢舉
好的,感謝您的推薦。

所以按照其他前輩的回應,其實我單純只是要搜尋某部份字串的話,是用不上REGEXP這個程式語言的。
因為並沒有要延伸其他較為專業的判斷,我會再找文章先釐清最適合目前需要的程式。

感謝您的提供。
如果真的沒有頭緒,我會來搜尋關鍵字查找。
剛剛看了一下,這邊討論的沒有Regexp example相關文章,我會去GOOGLE搜尋,謝謝!


給weiclin 前輩。
所以Ruby是一個程式語言的版本,不是一個敘述串?

理解上是跟JAVA、C++兩種版本差異,是一樣的概念嗎?
用其他程式語言會有錯誤衝突嗎?
weiclin iT邦高手 4 級 ‧ 2018-11-01 13:06:14 檢舉
你要講英文就講英文, 要用法文就學法文, 那不是什麼版本, 而是根本不同體系的語言, 如果你的程度只能照著書上的做, 那你除了 Ruby 以外什麼都別想, 要找教學也只能看 Ruby 的, 不要以為學了日文50音能對西班牙文有什麼幫助
韓寶寶 iT邦新手 5 級 ‧ 2018-11-01 13:58:06 檢舉
給weiclin前輩。

是的,我現在是完全沒有概念的,我的程度就是只能照著書上一步一步做的這種。
因為看到有工程師前輩說,我的需求可以透過REGEXP這個公式解決,所以才會延伸這些問題。

目前正在看Ruby相關的教學網站,謝謝您。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0

第一個問題已經由 weiclin前輩 回答你了

回答你第二個問題

兩者都讀取內容的情形

你可以在 Line Developers 內關閉Line@的回話功能

https://ithelp.ithome.com.tw/upload/images/20181101/20111102ppc1hrGKcP.png

兩者選擇為Disabled即可 這樣他就會只走程式碼讀取的部分

看更多先前的回應...收起先前的回應...
韓寶寶 iT邦新手 5 級 ‧ 2018-11-01 12:53:51 檢舉

感謝您的教學。

在後台端開啟關閉的部份,卡米大的教學文章裡面有。

不過我比較疑惑是,如果我使用程式碼跟LINE@後台端,兩者關鍵字同時並進的話,會有程式上的衝突嗎?
還是設立抓取字串的程式編碼時,會更便利一些?

如果會加深難度,我就會關閉LINE@後台端的關鍵字,如果會更便利,我就會考慮兩者並用。

我之前測試的結果是會變成
Line@帳號會 要求你輸入指定的關鍵字"一字不差"才能針對該答案去做回答且無法去即時更新
程式碼的部分就可以自己去編寫是否包含有關鍵字等與實時更新等功能
Line@的服務使用者可能比較面向固定服務的店家(不需要複雜操作的
Message Api就是可能需要多樣功能編寫的服務
根據你需要的功能 應該會面向使用Message Api

韓寶寶 iT邦新手 5 級 ‧ 2018-11-01 15:21:47 檢舉

您的意思是在程式語言上,LINE@後台端的關鍵字其實是非必要的存在。
因為已經使用Ruby編寫程式語言,所以基本很多操作都可以在Ruby這裡完成,LINE@後台端的關鍵字就不重要了。

如果理解沒錯的話……
所以,是否可以認為,直接關閉LINE@後台端的關鍵字,是目前最簡單的方式?

是的 我是這樣認為 因為如果你自己可以編寫規則了
Line@那定死的關鍵字回應 就無法滿足你目前的需求

韓寶寶 iT邦新手 5 級 ‧ 2018-11-02 14:05:36 檢舉

昨天回應到上限,不能再回。
今天趕緊來回復。
感謝您提供的訊息。
最後決定用更單純的方式,使用程式編寫,所以LINE@後台端的關鍵字我都撤下了,謝謝。

原來還有回覆上限 還真沒注意到 ..
程式語言有很多種 如其他前輩所講的C++ JAVA等等
那由於卡米狗前輩是使用Ruby去編寫的 如果你需要照著書做 可能就是需要學習Ruby的方法 也祝你成功

韓寶寶 iT邦新手 5 級 ‧ 2018-11-02 17:03:33 檢舉

有的,正在看介紹Ruby的網站。
正在盡力研讀,謝謝!

0
海綿寶寶
iT邦大神 1 級 ‧ 2018-11-01 11:35:16

根本不需要用到 RegExp
如果你已經完成LINE BOT 製作教學文章第22天的話
以下是修改後的版本
只要修改第 5 到第 14 列即可

require 'line/bot'
class KamigoController < ApplicationController
  protect_from_forgery with: :null_session

  def webhook
    #如果有兩個關鍵字其中一個,就進行判斷
    if received_text.include? "人物A" || received_text.include? "出去玩"
        if received_text.include? "人物A"
            response = reply_to_line("找我?")
        end
        if received_text.include? "出去玩"
            response = reply_to_line("你想去哪?")
        end
    #如果沒有兩個關鍵字,就直接回 無法判斷這句話
    else
        response = reply_to_line("無法判斷這句話")
    end    
    # 回應 200
    head :ok
  end 

  # 取得對方說的話
  def received_text
    message = params['events'][0]['message']
    message['text'] unless message.nil?
  end

  # 關鍵字回覆
  def keyword_reply(received_text)
    # 學習紀錄表
    keyword_mapping = {
      'QQ' => '神曲支援:https://www.youtube.com/watch?v=T0LfHEwEXXw&feature=youtu.be&t=1m13s',
      '我難過' => '神曲支援:https://www.youtube.com/watch?v=T0LfHEwEXXw&feature=youtu.be&t=1m13s'
    }
    
    # 查表
    keyword_mapping[received_text]
  end

  # 傳送訊息到 line
  def reply_to_line(reply_text)
    return nil if reply_text.nil?
    
    # 取得 reply token
    reply_token = params['events'][0]['replyToken']
    
    # 設定回覆訊息
    message = {
      type: 'text',
      text: reply_text
    } 

    # 傳送訊息
    line.reply_message(reply_token, message)
  end

  # Line Bot API 物件初始化
  def line
    @line ||= Line::Bot::Client.new { |config|
      config.channel_secret = '9160ce4f0be51cc72c3c8a14119f567a'
      config.channel_token = '2ncMtCFECjdTVmopb/QSD1PhqM6ECR4xEqC9uwIzELIsQb+I4wa/s3pZ4BH8hCWeqfkpVGVig/mIPDsMjVcyVbN/WNeTTw5eHEA7hFhaxPmQSY2Cud51LKPPiXY+nUi+QrXy0d7Hi2YUs65B/tVOpgdB04t89/1O/w1cDnyilFU='
    }
  end


  def eat
    render plain: "吃土啦"
  end 

  def request_headers
    render plain: request.headers.to_h.reject{ |key, value|
      key.include? '.'
    }.map{ |key, value|
      "#{key}: #{value}"
    }.sort.join("\n")
  end

  def response_headers
    response.headers['5566'] = 'QQ'
    render plain: response.headers.to_h.map{ |key, value|
      "#{key}: #{value}"
    }.sort.join("\n")
  end

  def request_body
    render plain: request.body
  end

  def show_response_body
    puts "===這是設定前的response.body:#{response.body}==="
    render plain: "虎哇花哈哈哈"
    puts "===這是設定後的response.body:#{response.body}==="
  end

  def sent_request
    uri = URI('http://localhost:3000/kamigo/eat')
    http = Net::HTTP.new(uri.host, uri.port)
    http_request = Net::HTTP::Get.new(uri)
    http_response = http.request(http_request)

    render plain: JSON.pretty_generate({
      request_class: request.class,
      response_class: response.class,
      http_request_class: http_request.class,
      http_response_class: http_response.class
    })
  end

  def translate_to_korean(message)
    "#{message}油~"
  end

end
韓寶寶 iT邦新手 5 級 ‧ 2018-11-01 12:59:34 檢舉

感謝您的提供。
我先測試這串編碼看看。

因為不僅有這兩個關鍵字,我還有設立其他關鍵字,所以必須要給BOT編寫一個抓取關鍵字紀錄資料的動作。

就好比,我的關鍵字設立有10~20個甚至以上,BOT在抓取關鍵字串的時候,會先去資料庫搜尋關鍵字。
不過整句話設立上,我最多只讓BOT抓取兩個關鍵字串。
再多就會回應無法判讀的訊息。

如果我在

  if received_text.include? "人物A"
            response = reply_to_line("找我?")

的"人物A"修改成前往資料檔案抓取關鍵字的指令
找我的地方修改成關鍵字回應的指令,這樣是可行的嗎?
還是要額外編寫一個各自判斷的指令?

我正在參考卡米大支援的網站:
變數、常數、流程控制、迴圈
我先研究一下裡面的教學內容。
感謝您。

「沒有學會走,先學跑,從來不是問題,但先問一問自己是不是天才。如果不是,就要一步步來。
Quote : 寒戰2 李文彬

韓寶寶 iT邦新手 5 級 ‧ 2018-11-01 15:30:16 檢舉

這道理我知道的。
但就是因為完全外行,連自己是在學走還是學跑都搞不清楚,所以只能抓看見問題的地方就發問,哈哈哈。

我現在的狀態大概就是「想吃一道料理(BOT),但連這道料理叫什麼名稱(使用的語言)都不知道的狀態,只能說出這道料理有什麼材料(看見的問題)。」/images/emoticon/emoticon06.gif

所以我很清楚,我的言論在專業前輩們面前很鬼打牆。
因為無法完整敘述我想表達的需求,也無法讀懂許多專業用語。/images/emoticon/emoticon13.gif

1
Darwin Watterson
iT邦好手 1 級 ‧ 2018-11-01 11:37:18

想學正則表示式,可以先從W3School JavaScript RegExp Reference起步走!
(話說似乎60%以上的Web技術都能從W3School起步走/images/emoticon/emoticon12.gif)

韓寶寶 iT邦新手 5 級 ‧ 2018-11-01 12:45:06 檢舉

感謝前輩的推薦。
我會找時間去找相關的新手讀物回來研讀。
想請問書籍的名稱是W3School嗎?
還是後面的字串也要搜尋會比較穩妥?

W3School是網站!
點上面連結後加入我的最愛就行了!

韓寶寶 iT邦新手 5 級 ‧ 2018-11-01 13:02:57 檢舉

啊,我誤會了。(汗
謝謝您提供的網站。

有看到有前輩提醒我,因為卡米狗的作者,使用的是Ruby,我會擔心這樣會不會有程式語言上的衝突,我先來研究一下。
非常感謝!

0

其實從你跟幾位大大們的對話。可以了解你對程式界的用語及規範並不那麼清楚。

認真來說,regexp(正則表示式),您可以將其視為一種可條件化的搜尋應用字串。
這種表示式是可應用到任何語言跟支援的軟體上。
如果說要用很白話的說法。你可以將其當成一種公式或是通用的函式。
如if、for這些語法一定會在任何語言或支援軟體上都會用的東西。

正則式的規則都大同小異。各大程式語言都會有其應用的函數包含了「搜尋」「取代」「包含」「截取」等等。(視程式語言支援的情況)。部份語言可能會有某些正則條件的應用語法不支援或是自行加上去的方式。這就需要自已去試看看才知道。

會使用正則,大多數是為了應用在一些未知定義的字串處理跟取得。或是需要多重處理同一字串內的值。用分解組合判斷的寫法太麻煩時。才會去應用。
如簡單來說的身份証驗証。如用程式化寫法的話。會需要用到3個if跟一段驗証判斷。最少的驗証也需要用到二個if。用正則的話,只要一段字串就可以解決。(當然,如果還是需要用到嚴格的驗証方式,正則還是辦不到的)

最後再跟你說一件事。正則的學問算簡單不簡單,算很難又不難。就連我自已也是處於一知半解的情況下。
我用的方式是,將常用的方式自行記錄下來。如在網路上看到這段正則可能有用的。我都會將其記錄下來。一但在某個場合上有必要的。我就會譽找其最接近能應用的正則語法來修改測試使用。

韓寶寶 iT邦新手 5 級 ‧ 2018-11-01 13:55:17 檢舉

不是不清楚。
形容不清楚可能還抬舉我了。

我是完全沒概念。/images/emoticon/emoticon16.gif

如果用學習程度來形容,我可能是連說話都不會的那一區塊。/images/emoticon/emoticon20.gif

呃、所以,如果以Ruby、JAVA、C++形容為各類別的書冊。
那regexp(正則表示式)就等同於三本書都會用上的某種敘述法。
是這個意思嗎?

0
opoepev
iT邦新手 5 級 ‧ 2018-11-02 16:53:36

可以先看看下面的 link 來了解 regexp 的規則
http://rocksaying.tw/archives/2670695.html

然後再看看你目前用的是哪個語法,再去查該語法的 regexp 的語法怎麼應用

ps
regexp 算是一個規範,所以不管是哪個語言寫出來的「規則」都會是一樣的

韓寶寶 iT邦新手 5 級 ‧ 2018-11-02 17:02:39 檢舉

謝謝您。
我已經網站存下,等研究完之前介紹Ruby的網站,就會來看。
現在其實有點卡殼,關於所謂函示、陣列等等的專用術語我會無法理解。

應該還是要從最基本的認識程式語言概念來拜讀才行。
還要找個時間去買書或爬文。
不然很多東西其實是看得懂文字,讀不懂意思。/images/emoticon/emoticon25.gif

真的很感謝。

我要發表回答

立即登入回答