java - 正则表达式以适合所有不以已知后缀列表(不是字符,而是单词)结尾的字符串
问题描述
我需要能够构建一个正则表达式来捕获所有可能的模式,除了以b
ori
或f
or结尾的字符串dt
。
我的字符串总是以单词开头,并且在结束后缀之前有一个下划线。
如果我没有dt
在后缀黑名单中,我可能会执行以下操作:
\w+_[^f|b|i]+ OR maybe (.*)_[^f|b|i]
但该[^x|y|z]
格式仅捕获单个字符,我无法将其与一系列字符组合。
任何帮助,将不胜感激,
谢谢。
解决方案
请注意,如果不以 结尾.*_[^f|b|i]
,则withmatches()
并不意味着匹配,如果它以字符集中定义的字符以外的字符结尾,则意味着匹配。但是,在这种情况下,它似乎没有任何区别。唯一的麻烦是在字符类中被视为管道字符,如果将其放在字符类中,将被视为 2 个单独的字符。|
dt
您至少有 2 个选项(可以有更多选项):使用匹配任何不以 , 结尾的字符串的正则表达式,或者_
将b
这些字母/字母组合与字符串末尾的下划线匹配并取反结果。i
f
dt
方法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());
}
输出是一样的。同样的不区分大小写的注释适用。
推荐阅读
- scala - 将 List[Any] 中的每个对象转换为特定类型?
- mysql - 如何在mysql中设置本地列表/元组变量
- regex - 如何将正则表达式应用于 MongoDB 字段
- c# - 将 MongoDB.Driver 从 2.7.0 升级到 2.7.1 后连接超时
- javascript - 如何处理 Ajax/POST/PHP
- ios - 如何使用自定义 url 将捕获的 .mov 文件保存到自定义相册?
- python - 多列绘图Python
- javascript - Openlayers 地图图块最初未在单页应用程序中加载
- javascript - 如何确保始终显示至少一个 DIV?
- javascript - 转换字符串值的Javascript方法