原本寫的機器人,是在做Line跟Facebook的機器人平台串接測試,所以後台的功能一模一樣,算是重複且浪費,尤其是後來一直增加功能,要在兩邊不斷的copy/paste,很傻。
因此,我把前後台切開,原本寫的功能只留下Line跟Facebook平台串接功能,後端的文字服務就獨立的寫在
https://github.com/orsonwang/text_Service
裡面的程式就很單純的,扮演nats的服務接收端,等待前面的服務要求,找出對應的回應來回覆給前端。
使用RegExp來做文字服務只有一個大原則,『從大從長優照的指令,關鍵字越長的要擺在前面,字數越多的要擺在前面,最後再擺上短句,這樣就不會出錯了。
裡面應用了golang的空switch多重case的語法,也就是在以前要寫長長的if-else if敘述的部分,用case處理,乾淨點也好整理調整。
以下是範例
case matchString("(美元|美金|USD)+.*匯率+.*", strAfterCut): strResult = "美金匯率\n" + "現金 " + exRates["美金"].inCashRate + "\n" + "現金賣出 " + exRates["美金"].outCashRate + "\n" + "即期買入 " + exRates["美金"].inRate + "\n" + "即期賣出 " + exRates["美金"].outRate break case matchString("匯率+.*(美元|美金|USD)+.*", strAfterCut): strResult = "美金匯率\n" + "現金買入 " + exRates["美金"].inCashRate + "\n" + "現金賣出 " + exRates["美金"].outCashRate + "\n" + "即期買入 " + exRates["美金"].inRate + "\n" + "即期賣出 " + exRates["美金"].outRate break case matchString("(美元|美金|USD)+.*", strAfterCut): strResult = "美金匯率\n" + "現金買入 " + exRates["美金"].inCashRate + "\n" + "現金賣出 " + exRates["美金"].outCashRate + "\n" + "即期買入 " + exRates["美金"].inRate + "\n" + "即期賣出 " + exRates["美金"].outRate break
先處理「幣別」-匯率,然後處理倒裝的匯率-「幣別」,最後沒東西了,送給使用者「幣別」的預設處理,這樣就完成了在一個句子裡查詢單一匯率的功能。
當然,如果你想要對應來亂的一個句子放兩個幣別,甚至於穿插其他鍵,那就需使用/撰寫具有NLU(Natural Language Understanding)能力的文字處理引擎,如果你有寫好了,請告訴我,我想用。