首页 > 解决方案 > 正则表达式以适合所有不以已知后缀列表(不是字符,而是单词)结尾的字符串

问题描述

我需要能够构建一个正则表达式来捕获所有可能的模式,除了以borifor结尾的字符串dt

我的字符串总是以单词开头,并且在结束后缀之前有一个下划线。
如果我没有dt在后缀黑名单中,我可能会执行以下操作: \w+_[^f|b|i]+ OR maybe (.*)_[^f|b|i]

但该[^x|y|z]格式仅捕获单个字符,我无法将其与一系列字符组合。

任何帮助,将不胜感激,

谢谢。

标签: javaregex

解决方案


请注意,如果不以 结尾.*_[^f|b|i],则withmatches()并不意味着匹配,如果它以字符集中定义的字符以外的字符结尾,则意味着匹配。但是,在这种情况下,它似乎没有任何区别。唯一的麻烦是在字符类中被视为管道字符,如果将其放在字符类中,将被视为 2 个单独的字符。|dt

您至少有 2 个选项(可以有更多选项):使用匹配任何不以 , 结尾的字符串的正则表达式,或者_b这些字母/字母组合与字符串末尾的下划线匹配并取反结果。ifdt

方法1

List<String> strs = Arrays.asList("aaaa_b", "zzzzzz_i", "---------_f", "TTTTT_dt", "..._.");
        for (String str : strs)
            System.out.println("\"" + str + "\": " + str.matches(".*(?<!_[bif]|_dt)"));

输出:

"aaaa_b": false
"zzzzzz_i": false
"---------_f": false
"TTTTT_dt": false
"..._.": true

注意:为了不区分大小写,您可以在模式前加上(?i), "(?i).*(?<!_[bif]|_dt)"。此外,.默认情况下不匹配换行符,您可能希望让它与(?s),匹配"(?si).*(?<!_[bif]|_dt)"

方法2

List<String> strs = Arrays.asList("aaaa_b", "zzzzzz_i", "---------_f", "TTTTT_dt", "..._.");
Pattern p = Pattern.compile("_(?:[bif]|dt)\\z");
for (String str : strs) {
    System.out.println("\"" + str + "\": " + !p.matcher(str).find());
}

输出是一样的。同样的不区分大小写的注释适用。


推荐阅读