正則表達式中的'/'替換
近期項目對接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:
如果您覺得我的文章對您有幫助,請關注我的微信公眾號,謝謝!