由MQTT topic的正则表达式匹配引发的特殊字符"/"匹配思考
正则表达式中的'/'替换
近期项目对接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:
如果您觉得我的文章对您有帮助,请关注我的微信公众号,谢谢!