由MQTT topic的正則表達式匹配引發的特殊字符"/"匹配思考


正則表達式中的'/'替換

近期項目對接OneNETMQTT物聯網套件,需要完成命令下發流程.

流程要求:
(1)設備在接收平台下發的命令(topic$sys/{pid}/{device-name}/cmd/request/{cmdid});
(2)上傳響應至$sys/{pid}/{device-name}/cmd/response/{cmdid}.

初次嘗試

在項目編碼中,需要對命令的topic進行正則表達式匹配,以便完成后續響應返回工作.
原正則表達式如下所示:

// 注冊的命令topic為$sys/{pid}/{device-name}/cmd/#
String topicForRegex = topic.replaceAll("\\+", "[^/]+").replaceAll("#", "(.+)") + "$";

此處,使用.+替換#,以便匹配cmd/后續任意字符.
然而,匹配失敗.

正則表達式修改

將正則表達式放置於https://regex101.com/進行檢驗,發現正則表達式存在問題.

錯誤的正則表達式

其中右下角提示錯誤,需要對正則表達式中的/進行替換,修改為如下樣式:

正確的正則表達式

原正則表達式中,存在特殊字符/以及$,需要對其進行轉義處理,即修改為\/以及\$.
因此代碼修改為如下格式:

// 注冊的命令topic為$sys/{pid}/{device-name}/cmd/#
if (topic.startsWith("$")) {
    topic = "\\" + topic;
}
String topicForRegex = topic
                .replaceAll("/", "\\\\/")
                .replaceAll("\\+", "[^/]+")
                .replaceAll("#", "(.+)") + "$";

此處,需要注意/字符替換,需要使用\\\\/進行(具體可參考https://stackoverflow.com/questions/13153697/how-to-replace-with-in-a-java-string).

PS:
如果您覺得我的文章對您有幫助,請關注我的微信公眾號,謝謝!
程序員打怪之路


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM