我有兩個正則表達式。我想刪除所有匹配的第二個,如果他們被放置在第一個匹配。基本上,沒有任何東西可以匹配已經匹配的東西。例如:刪除其他正則表達式匹配的正則表達式匹配
一正則表達式(粗體) - 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功能 –