如何使用python正则表达式将路由密钥与RabbitMQ主题交换的绑定模式匹配?
我基本上是在研究RabbitMQ。我正在编写一个python代码,其中我试图查看在主题交换的情况下路由键是否与绑定模式匹配。我看到了这个链接,上面写着“但是绑定密钥有两个重要的特殊情况:如何使用python正则表达式将路由密钥与RabbitMQ主题交换的绑定模式匹配?,python,regex,rabbitmq,Python,Regex,Rabbitmq,我基本上是在研究RabbitMQ。我正在编写一个python代码,其中我试图查看在主题交换的情况下路由键是否与绑定模式匹配。我看到了这个链接,上面写着“但是绑定密钥有两个重要的特殊情况: * (star) can substitute for exactly one word. # (hash) can substitute for zero or more words. 那么,如何将消息的路由密钥与队列的绑定模式匹配呢?例如,消息的路由密钥是“my.routing.key”,而队列是使用绑
* (star) can substitute for exactly one word.
# (hash) can substitute for zero or more words.
那么,如何将消息的路由密钥与队列的绑定模式匹配呢?例如,消息的路由密钥是“my.routing.key”,而队列是使用绑定模式“my.#”绑定到主题交换的*“。一般来说,如何匹配主题交换的这些字符串模式,最好是使用python正则表达式。这是节点库的一个几乎直接的端口:
如果可以的话,我有一些Java代码
Pattern toRegex(String pattern) {
final String word = "[a-z]+";
// replace duplicate # (this makes things simpler)
pattern = pattern.replaceAll("#(?:\\.#)+", "#");
// replace *
pattern = pattern.replaceAll("\\*", word);
// replace #
// lone #
if ("#".equals(pattern)) return Pattern.compile("(?:" + word + "(?:\\." + word + ")*)?");
pattern = pattern.replaceFirst("^#\\.", "(?:" + word + "\\.)*");
pattern = pattern.replaceFirst("\\.#", "(?:\\." + word + ")*");
// escape dots that aren't escapes already
pattern = pattern.replaceAll("(?<!\\\\)\\.", "\\\\.");
return Pattern.compile("^" + pattern + "$");
}
Pattern-toRegex(字符串模式){
最后一个字符串字=“[a-z]+”;
//替换重复的#(这使事情更简单)
pattern=pattern.replaceAll(“\(?:\ \。\)+”,“\”;
//替换*
pattern=pattern.replaceAll(“\\*”,word);
//替换#
//孤独的#
if(“\”.equals(pattern))返回pattern.compile((?:“+word+”(?:\\.“+word+”*));
pattern=pattern.replaceFirst(“^\\”,“(?:“+word+“\\”)*”;
pattern=pattern.replaceFirst(“\\.\”,“(?:\\.“+word+”*”);
//已经不是逃逸的逃逸点
pattern=pattern.replaceAll(“(?我们使用此模式将RabbitMQ模式转换为正则表达式:
from typing import Pattern
def convert(pattern: str) -> Pattern:
pattern = (
pattern
.replace('*', r'([^.]+)')
.replace('.#', r'(\.[^.]+)*')
.replace('#.', r'([^.]+\.)*')
)
return re.compile(f"^{pattern}$")
您能提供输入和所需的输出示例吗?input=“my.routing.key”,pattern=“my.#.*,output=true,这里#表示零个或多个单词,*表示正好一个单词。可能我不够清楚。您收到随机字符串,并且必须说它是否匹配“my.routing.key”?如果是,您甚至不需要正则表达式。只需string\u进行测试==“my.routing.key”
您不知道,输入字符串必须匹配模式(通配符匹配)my.routing.key必须匹配模式my.#。*很好!我发现了两个可能不需要的匹配,例如amqp_匹配('a.b.c.),'*.b.#')
和amqp_匹配('a..c','...*.*.*.
(虽然如果你的键一开始是合理的,它们就没有问题:)你能提供到C#或VB.NET的转换吗?@DavidP sry regex对我来说是只写代码。不知道是谁发明了这种语法,但我甚至不试图理解在看到模式时发生了什么,即使是我自己写的
from typing import Pattern
def convert(pattern: str) -> Pattern:
pattern = (
pattern
.replace('*', r'([^.]+)')
.replace('.#', r'(\.[^.]+)*')
.replace('#.', r'([^.]+\.)*')
)
return re.compile(f"^{pattern}$")