2

我正在使用 Mqtt (Paho)​​ 实现一个 Android 应用程序。我有一些组件,我必须将包含通配符的订阅主题与客户发布到的实际主题进行比较。

我只是不明白它,我的“基本”正则表达式技能也无济于事......

Paho/Java MQTT 中是否有实用程序类来查看是否

“SENSOR/TEMPERATURE/+/DEGREE/#/ID”(订阅主题)

适用于

“SENOR/TEMPERATURE/GARDEN/DEGREE/CELSIUS/ABOVEZERO/ID”(实际主题)?

有人知道最好的方法是什么吗?

谢谢!

编辑:您好-我认为这应该是正确的

public static boolean compareTopic(final String actualTopic, final String subscribedTopic){

   return actualTopic.matches(subscribedTopic.replaceAll("\\+", "[^/]+").replaceAll("#", ".+"));
}
4

3 回答 3

3

您的解决方案应该有效,因此在您的示例中,正则表达式将是

"SENSOR/TEMPERATURE/[^/]+/DEGREE/.+/ID"

http://www.regexplanet.com/advanced/java/index.html这样的网站对于此类案例来说是一个非常好的资源。

于 2015-06-15T15:03:27.263 回答
3

mosquitto_topic_matches_sub()在 util_topic.c 中的函数中有一个如何将 MQTT 主题与订阅匹配的示例:

https://github.com/eclipse/mosquitto/blob/master/lib/util_topic.c

看起来很简单,但是有一些问题需要处理,所以你的简单正则表达式并不能很好地完成这项工作。

于 2015-06-22T15:51:43.460 回答
0

我已经进行了一些测试,我认为这可行:

String topicExp = topicPattern//
        .replaceAll("\\$", "\\\\\\$")//
        .replaceAll("\\+", "[^/]+")//
        .replaceAll("/\\#$", "(\\$|/.+)");

Pattern pattern = Pattern.compile(topicExp);
boolean match = pattern.matcher(topic).matches();
return match;
于 2021-08-31T00:33:14.127 回答