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

时间:2016-11-07 02:00:48

标签: java regex

我有两个正则表达式。我想删除第二个匹配的所有匹配项,如果它们放在第一个匹配项中。基本上,在已经匹配的东西中没有任何东西可以匹配。例如:

第一个正则表达式(粗体) - // pretty print data function out($data, $label = NULL) { $CLI = (php_sapi_name() === 'cli') ? 'cli' : ''; $gettype = gettype($data); if (isset($label)) { if ($CLI) { $label = $label . ': '; } else { $label = '<b>'.$label.'</b>: '; } } if ($gettype == 'string' || $gettype == 'integer' || $gettype == 'double' || $gettype == 'boolean') { if ($CLI) { echo $label . $data . "\n"; } else { echo $label . $data . "<br/>"; } } else { if ($CLI) { echo $label . print_r($data,1) . "\n"; } else { echo $label . "<pre>".print_r($data,1)."</pre>"; } } } // Usage out('Hello world!'); $var = 'Hello Stackoverflow!'; out($var, 'Label'); 查找以c\w+开头的单词

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

结果:骆驼犯罪护理酷中等融化家庭

c-words中的me也匹配。我想要的是:骆驼犯罪护理酷中等融化家庭

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

me

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

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

2 个答案:

答案 0 :(得分:2)

首先,你可以实现像这样将两个表达式合并为一个。

(^c\w+)|\s(c\w+)|(\w*me\w*)

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

但请注意,这只适用于您知道单词的分隔符的情况,在本例中为\ 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语句只会在第一个失败的情况下执行。

答案 1 :(得分:1)

是不是可以组合两个正则表达式?例如,使用此代码使用一个正则表达式可以找到me之后的c

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

请在此处查看:https://regex101.com/r/bfNkvF/2