zoukankan      html  css  js  c++  java
  • 由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:
    如果您觉得我的文章对您有帮助,请关注我的微信公众号,谢谢!
    程序员打怪之路

  • 相关阅读:
    前端agl分页的写法
    分布式项目spring 配置文件的约束
    电脑维修常用硬件技术
    电脑维修常用检修软件技术
    电脑维修快速入门
    电脑维修基本流程
    re模块
    flask-本地线程-请求上下文补充
    SEO(搜索引擎优化)
    前端基础之jquery
  • 原文地址:https://www.cnblogs.com/jason1990/p/11589297.html
Copyright © 2011-2022 走看看