下面是我试图从中找到模式的基本Java方法。
public static void stringFilter() {
int compVal = 33331;
List<String> strList = new ArrayList<String>() {{
add("app_Usage_RTIS/batch_id=11111/abc");
add("ENV_RTIS/batch_id=22222/");
add("ABCD-EFG_RTIS/batch_id=33333/");
add("/RTIS/batch_id=44444/");
add("/batch_id=55555/");
}};
Pattern pattern = Pattern.compile(".*_RTIS/batch_id=(\\d+)/.*");
for (String s : strList) {
Matcher matcher = pattern.matcher(s);
if (matcher.matches()) {
System.out.println(s + "\tTrue");
}
}
}
上面的代码对我来说很好,可以选择包含"_RTIS/batch_id=123***/"
的字符串,但是我的想法是仅选择不包含"_RTIS"
但包含“ / batch_id = 123 **的字符串” * /“。
我尝试过
`Pattern pattern = Pattern.compile(".*(!_RTIS)/batch_id=(\\d+)/.*");`
但这对我没有用。
为清楚起见,我的输出应仅选择->
"/RTIS/batch_id=44444/" True
"/batch_id=55555/" True
谢谢。
答案 0 :(得分:0)
您知道要关闭。您可以使用negative-look-behind (?<!...)
来要求/batch_id=(\\d+)
部分之前没有与_RTIS
相匹配的内容。
因此您的正则表达式可能类似于:".*(?<!_RTIS)/batch_id=(\\d+)/.*"
。
演示:
List<String> strList = Arrays.asList(
"app_Usage_RTIS/batch_id=11111/abc",
"ENV_RTIS/batch_id=22222/",
"ABCD-EFG_RTIS/batch_id=33333/",
"/RTIS/batch_id=44444/",
"/batch_id=55555/"
);
Pattern pattern = Pattern.compile(".*(?<!_RTIS)/batch_id=(\\d+)/.*");
for (String s : strList) {
if (pattern.matcher(s).matches()) {
System.out.println(s + "\tTrue");
}
}
输出:
/RTIS/batch_id=44444/ True
/batch_id=55555/ True