我试图排除使用XDCR将某些文档传输到ES。我有以下筛选ABCD和IJ的正则表达式
https://regex101.com/r/gI6sN8/11
现在,我想在XDCR筛选中使用这个正则表达式。
^(?!).$

如何使用regex排除键?
编辑:
如果我想选择不包含ABCDE和ABCHIJ的所有内容,该怎么办?
我试过了
发布于 2016-08-16 17:54:20
编辑:
对不起,再看一下,这个方法是无效的。例如,^B允许A通过,让AABCD通过(因为它首先将匹配AA,然后匹配BCD与^A,请忽略这个帖子。
(无视这个)
您可以使用posix风格的技巧来排除单词。
下面是排除ABCD和IJ。
从这里你可以了解到这种模式。
基本上,你把所有的前几个字母都放进了一个负面的类
作为替换列表中的第一个,然后处理每个单词。
在单独的交替中。
^(?:[^AI]+|(?:A(?:[^B]|$)|AB(?:[^C]|$)|ABC(?:[^D]|$))|(?:I(?:[^J]|$)))+$
扩容
^
(?:
[^AI]+
|
(?: # Handle 'ABCD`
A
(?: [^B] | $ )
| AB
(?: [^C] | $ )
| ABC
(?: [^D] | $ )
)
|
(?: # Handle 'IJ`
I
(?: [^J] | $ )
)
)+
$发布于 2018-02-07 03:45:18
希望有一天会有内置的支持倒置比赛的表达式。同时,这里有一个Java 8程序,它使用Couchbase XDCR过滤器支持的基本regex特性为反向前缀匹配生成正则表达式。
只要您的键前缀以某种方式与键的其余部分分隔,这就可以工作。在修改此代码时,请确保在输入中包含分隔符。
red:、reef:、green:的示例输出如下:
^([^rg]|r[^e]|g[^r]|re[^de]|gr[^e]|red[^:]|ree[^f]|gre[^e]|reef[^:]|gree[^n]|green[^:])文件: NegativeLookaheadCheater.java
import java.util.*;
import java.util.stream.Collectors;
public class NegativeLookaheadCheater {
public static void main(String[] args) {
List<String> input = Arrays.asList("red:", "reef:", "green:");
System.out.println("^" + invertMatch(input));
}
private static String invertMatch(Collection<String> literals) {
int maxLength = literals.stream().mapToInt(String::length).max().orElse(0);
List<String> terms = new ArrayList<>();
for (int i = 0; i < maxLength; i++) {
terms.addAll(terms(literals, i));
}
return "(" + String.join("|", terms) + ")";
}
private static List<String> terms(Collection<String> words, int index) {
List<String> result = new ArrayList<>();
Map<String, Set<Character>> prefixToNextLetter = new LinkedHashMap<>();
for (String word : words) {
if (word.length() > index) {
String prefix = word.substring(0, index);
prefixToNextLetter.computeIfAbsent(prefix, key -> new LinkedHashSet<>()).add(word.charAt(index));
}
}
prefixToNextLetter.forEach((literalPrefix, charsToNegate) -> {
result.add(literalPrefix + "[^" + join(charsToNegate) + "]");
});
return result;
}
private static String join(Collection<Character> collection) {
return collection.stream().map(c -> Character.toString(c)).collect(Collectors.joining());
}
}https://stackoverflow.com/questions/38980161
复制相似问题