我有两个正则表达式。我想删除所有匹配的第二个,如果他们被放置在第一个匹配。基本上,没有任何东西可以匹配已经匹配的东西。例如:删除其他正则表达式匹配的正则表达式匹配
一正则表达式(粗体) - c\w+
认定话开始与c
二正则表达式(下划线) - me
发现me
结果:骆驼犯罪护理酷中等熔体家
me
用c字也匹配。想要我想要的是:骆驼犯罪护理酷中融化家
第二个正则表达式的两个结果是在第一个正则表达式的结果,我想删除它们,或者根本就不匹配它们。下面是我的尝试:
String text = "camel crime care cool medium melt home";
static final Pattern PATTERN_FIRST = Pattern.compile("c\w+");
static final Pattern PATTERN_SECOND = Pattern.compile("me");
// Save all matches
List<int[]> firstRegexMatches = new ArrayList<>();
for (Matcher m = PATTERN_FIRST.matcher(text); m.find();) {
firstRegexMatches.add(new int[]{m.start(), m.end()});
}
List<int[]> secondRegexMatches = new ArrayList<>();
for (Matcher m = PATTERN_SECOND.matcher(text); m.find();) {
secondRegexMatches.add(new int[]{m.start(), m.end()});
}
// Remove matches of second inside matches of first
for (int[] pos : firstRegexMatches) {
Iterables.removeIf(secondRegexMatches, p -> p[0] > pos[0] && p[1] < pos[1]);
}
在这段代码中我存储到列表中同时提供的所有比赛,然后尝试从第二列表中删除火柴放在里面第一个列表匹配。
这不仅不起作用,但我不确定它是非常有效的。请注意,这是我的情况的简化版本,其中包含更多正则表达式和大量文本。 Iterables来自Guava。
我不清楚你想要做什么。你是否试图从字符串中删除它们,以便结果是“cal cal care cool medium melt home”?如果是这样,你的问题就不清楚了。此外,我没有看到任何代码实际上从字符串中删除任何东西。另外,什么是'Iterables'?它不在标准的Java库中,那它是什么? Apache的?番石榴?如果没有这些信息,我不知道发生了什么,但看起来你的'removeIf'从你创建的'List'中删除了一对。它不会从字符串中删除任何内容。 – ajb
此外,您的第一个模式会查找任何“c”是否在单词的开头。 – ajb
@ajb所有匹配项都保存到列表中。我试图从第二个正则表中删除它们。 Iterables来自番石榴,我无法使用Java 8功能 –