我有两个正则表达式。我想删除第二个匹配的所有匹配项,如果它们放在第一个匹配项中。基本上,在已经匹配的东西中没有任何东西可以匹配。例如:
第一个正则表达式(粗体) - // 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。
答案 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