正則表達式中的'/'替換
近期項目對接OneNET的MQTT物聯網套件,需要完成命令下發流程.
流程要求:
(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:
如果您覺得我的文章對您有幫助,請關注我的微信公眾號,謝謝!

