W zasadzie pracuję nad Rabbitmq. Piszę kod Pythona, w którym próbuję sprawdzić, czy klucze routingu pasuje do wzorca wiązania w przypadku wymiany tematycznej. Natknąłem się na ten link- https://www.rabbitmq.com/tutorials/ Tutorial-pięć-java.html gdzie mówi: "Jednak istnieją dwa ważne przypadki dla kluczy wiążących:

* (star) can substitute for exactly one word.

# (hash) can substitute for zero or more words.

Jak więc pasuję do klawisza routingu wiadomości z wiążącym wzorem kolejki? Na przykład klawisz routingu komunikatu to "my.Routing.key", a kolejka jest związana z wymianą tematu z wzorem wiązania - "My. #. *". Ogólnie rzecz biorąc, w jaki sposób pasuję do tych wzorców łańcuchów do wymiany tematycznej, najlepiej patrzę na użycie Pythona Regexa.

2
shweta 4 czerwiec 2018, 14:06

3 odpowiedzi

Najlepsza odpowiedź

Mam jakiś kod Java, jeśli to może pomóc

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 + "$");
}

Może ktoś może przetłumaczyć to do Pythona.

2
benez 10 wrzesień 2018, 17:12

Używamy tego wzorca do konwersji wzorców Rabbitmq do Regexesa:

from typing import Pattern

def convert(pattern: str) -> Pattern:
    pattern = (
        pattern
        .replace('*', r'([^.]+)')
        .replace('.#', r'(\.[^.]+)*')
        .replace('#.', r'([^.]+\.)*')
    )
    return re.compile(f"^{pattern}$")
0
Josh Bode 30 wrzesień 2018, 08:01

Jest to niemal bezpośredni port węzła lib AMQP-Mecz:

import re

def amqp_match(key: str, pattern: str) -> bool:
    if key == pattern:
        return True
    replaced = pattern.replace(r'*', r'([^.]+)').replace(r'#', r'([^.]+.?)+')
    regex_string = f"^{replaced}$"
    match = re.search(regex_string, key)
    return match is not None
3
Eivydas Vilčinskas 21 sierpień 2018, 07:02