删除放置在其他正则表达式匹配中的正则表达式匹配



我有两个正则表达式。我想删除第二个的所有匹配,如果他们被放置在第一个的匹配。基本上,已经匹配的东西无法匹配。例子:

第一个正则表达式(粗体)- cw+查找以c

开头的单词

第二个正则表达式(下划线)- me找到me

结果:凸轮̲̲e l罪犯̲̲e保健酷 m e̲̲器e m e̲̲lt hom̲̲

c字中的me也匹配。想要我想要的是:骆驼犯罪保健酷 m e̲̲器e m e̲̲lt hom̲̲

第二个正则表达式的两个结果在第一个正则表达式的结果中,我想删除它们,或者根本不匹配它们。下面是我的尝试:

String text = "camel crime care cool medium melt home";
static final Pattern PATTERN_FIRST = Pattern.compile("cw+");
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]);
}

在这段代码中,我将两者的所有匹配存储到列表中,然后尝试从第二个列表中删除放置在第一个列表匹配中的匹配。

这不仅不起作用,而且我不确定它是否有效。请注意,这是我的情况的简化版本,其中包含更多的正则表达式和较大的文本。

首先,您可以将两个表达式合并为一个。

(^cw+)|s(cw+)|(w*mew*)

如果你匹配这个正则表达式,每个匹配将是一个以"c"开头的单词,后面跟着一些单词字符,或者一个包含"me"的单词。对于每一场比赛,你要么得到小组:(1)或(2)表示以"c"开头的单词或(3)表示含有"me"的词

但是请注意,这只在您知道单词的分隔符的情况下起作用,在本例中是一个s字符。

示例代码:

    String text = "camel crime care cool medium melt home";
    final Pattern PATTERN = Pattern.compile("(^c\w+)|\s(c\w+)|(\w*me\w*)");
    // Save all matches
    List<String> wordsStartingWithC = new ArrayList<>();
    List<String> wordsIncludingMe = new ArrayList<>();
    for (Matcher m = PATTERN.matcher(text); m.find();) {
        if(m.group(1) != null) {
            wordsStartingWithC.add(m.group(1));
        } else if(m.group(2) != null) {
            wordsStartingWithC.add(m.group(2));
        } else if(m.group(3) != null) {
            wordsIncludingMe.add(m.group(3));
        }
    }
    System.out.println(wordsStartingWithC);
    System.out.println(wordsIncludingMe);

我建议通过采用一种稍微不同的方法来简化。由于您似乎知道单词限制符,即空白字符,因此只需拆分原始字符串即可获得所有单词的集合。

String[] words = "camel crime care cool medium melt home".split(" ");

然后简单地遍历所有这些

for(String word: words) {                
    if(word.startsWith("c")) {
        // put in your list for words starting with "c"
    } else if (word.contains("me")) {
        // put in your list for words containing "me"
    }
}

这将导致两个没有重复条目的列表,因为只有在第一个if语句失败的情况下才会执行第二个if语句。

是否可以将两个正则表达式结合起来?例如,c之后的me可以使用一个正则表达式找到,代码如下:

((?<=c)|(?<=cw)|(?<=cw{2})|(?<=cw{3})|(?<=cw{4})|(?<=cw{5}))me

点击这里查看:https://regex101.com/r/bfNkvF/2

相关内容

最新更新