由MQTT topic的正则表达式匹配引发的特殊字符"/"匹配思考

时间:2019-09-26
本文章向大家介绍由MQTT topic的正则表达式匹配引发的特殊字符"/"匹配思考,主要包括由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).

原文地址:https://www.cnblogs.com/jason1990/p/11589297.html