首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Couchbase xdcr regex -如何使用regex排除键?

Couchbase xdcr regex -如何使用regex排除键?
EN

Stack Overflow用户
提问于 2016-08-16 16:36:16
回答 2查看 275关注 0票数 1

我试图排除使用XDCR将某些文档传输到ES。我有以下筛选ABCD和IJ的正则表达式

https://regex101.com/r/gI6sN8/11

现在,我想在XDCR筛选中使用这个正则表达式。

^(?!).$

如何使用regex排除键?

编辑:

如果我想选择不包含ABCDE和ABCHIJ的所有内容,该怎么办?

我试过了

https://regex101.com/r/zT7dI4/1

EN

回答 2

Stack Overflow用户

发布于 2016-08-16 17:54:20

编辑:

对不起,再看一下,这个方法是无效的。例如,^B允许A通过,让AABCD通过(因为它首先将匹配AA,然后匹配BCD与^A,请忽略这个帖子。

这里的演示显示下面的方法是无效的

(无视这个)

您可以使用posix风格的技巧来排除单词。

下面是排除ABCDIJ

从这里你可以了解到这种模式。

基本上,你把所有的前几个字母都放进了一个负面的类

作为替换列表中的第一个,然后处理每个单词。

在单独的交替中。

^(?:[^AI]+|(?:A(?:[^B]|$)|AB(?:[^C]|$)|ABC(?:[^D]|$))|(?:I(?:[^J]|$)))+$

演示

扩容

代码语言:javascript
复制
 ^ 
 (?:
      [^AI]+ 
   |  
      (?:                     # Handle 'ABCD`
           A
           (?: [^B] | $ )
        |  AB
           (?: [^C] | $ )
        |  ABC
           (?: [^D] | $ )
      )
   |  
      (?:                     # Handle 'IJ`
           I
           (?: [^J] | $ )
      )
 )+
 $
票数 1
EN

Stack Overflow用户

发布于 2018-02-07 03:45:18

希望有一天会有内置的支持倒置比赛的表达式。同时,这里有一个Java 8程序,它使用Couchbase XDCR过滤器支持的基本regex特性为反向前缀匹配生成正则表达式。

只要您的键前缀以某种方式与键的其余部分分隔,这就可以工作。在修改此代码时,请确保在输入中包含分隔符。

red:reef:green:的示例输出如下:

代码语言:javascript
复制
^([^rg]|r[^e]|g[^r]|re[^de]|gr[^e]|red[^:]|ree[^f]|gre[^e]|reef[^:]|gree[^n]|green[^:])

文件: NegativeLookaheadCheater.java

代码语言:javascript
复制
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());
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38980161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档