Java 通过正则替换 rabbitMQ topic 的路由 key

目录

  • Topic 规则描述
  • 代码实现

Topic 规则描述

1、对 key 进行分割,分割符为 “.” ,分割后得到多个单词,将每个单词看作一个整体,空也算一个单词。 (ab…bc 切割后得到 【ab, Ø, bc】)
2、* 匹配 1 个单词。 (对应正则的 [^\.]*)
3、# 匹配 0 或 多个单词。(对应正则的 ([^\.]*\.)*)

代码实现

/**
     * 将 # 和 * 转换为正则表达式
     * @param key
     * @return
     */
    public static String changeRouteKey(String key) {

        key = changeRegular(key);

        // .*.  .*$  ^*.   ===> .[^\.]*.  .[^\.]*$  ^[^\.]*.
        key = key.replaceAll("\\\\\\.\\\\\\*\\\\\\.", "\\\\\\.[^\\\\.]*\\\\\\.");
        key = key.replaceAll("\\\\\\.\\\\\\*$", "\\\\\\.[^\\\\.]*\\$");
        key = key.replaceAll("^\\\\\\*\\\\\\.", "^[^\\\\.]*\\\\\\.");

        // .#. ===> .([^\.]*\.)*
        key = key.replaceAll("\\\\\\.#\\\\\\.", "\\\\\\.([^\\\\.]*\\\\\\.)*");

        // ^#. ===> ^[^\.]*(\.[^\.]*)*
        key = key.replaceAll("^#\\\\\\.", "^([^\\\\.]*\\\\\\.)*");

        // .#$ ===> [^\.]*(\.[^\.]*)*$
        key = key.replaceAll("\\\\\\.#$", "(\\\\\\.[^\\\\.]*)*\\$");

        return key;
    }

    /**
     * 转义正则特殊字符 ($()*+.[]?\^{},|)
     * @param keyword
     * @return
     */
    public static String changeRegular(String keyword) {
        if (StringUtils.isNotBlank(keyword)) {
            String[] fbsArr = { "\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|" };
            for (String key : fbsArr) {
                keyword = keyword.replace(key, "\\" + key);
            }
        }
        return keyword;
    }

你可能感兴趣的:(java,开发语言,rabbitmq,topic)