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;
}