首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex -按任何顺序排列的单词

Regex -按任何顺序排列的单词
EN

Stack Overflow用户
提问于 2020-03-12 15:23:36
回答 2查看 104关注 0票数 2

假设我有3个字符串,它们必须多次出现,但经常出现不同的情况。

  1. "ab"正好出现1 time
  2. "cd"正好2 times
  3. "ef"正好出现3次

假设它们必须用一个逗号分隔。

它应该与以下内容匹配:

  • ab,ef,cd,ef,cd,ef
  • cd,cd,ef,ab,ef,ef

它应该是而不是匹配:

  • ab,cd,ef //太short
  • ab,xx,ef,cd,ef,cd,ef // xx,是invalid
  • xx,ab,cd,cd,ef,ef,ef // xx,是无效的

我发现:

代码语言:javascript
复制
\b(?=\w*ab)(?=\w*cd)(?=\w*ef)[abcdcdefefef]{12}\b

但是I不能与逗号、相匹配--我不想将所有的单词都添加到末尾的字母数(a dcff{12}),因为我需要将它用于很多更大的字符串。

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-12 15:40:03

忘了裁判吧。

代码语言:javascript
复制
    Map<String, Long> expectedFreqTable = new HashMap<>();
    expectedFreqTable .put("ab", 1L);
    expectedFreqTable .put("cd", 2L);
    expectedFreqTable .put("ef", 3L);

    String[] words = input.split(",");
    Map<String, Long> actualFreqTable = Stream.of(words)
            .collect(Collectors.groupingBy(Function.identity(), 
                    Collectors.counting()));

    return expectedFreqTable.equals(actualFreqTable);

Regex太复杂了,很难搞清楚。上面的内容更详细,但维护和阅读要容易得多。

新Java:

代码语言:javascript
复制
    Map<String, Long> expectedFreqTable = Map.of(
            "ab", 1L,
            "cd", 2L,
            "ef", 3L);
票数 4
EN

Stack Overflow用户

发布于 2020-03-12 15:34:19

您可以使用一个与检查输入字符串长度相结合的查找头组合:

代码语言:javascript
复制
String[] inputs = new String[] {
    "ab,ef,cd,ef,cd,ef",    // should match
    "cd,cd,ef,ab,ef,ef",    // should match
    "ab,cd,ef",             // too short
    "ab,xx,ef,cd,ef,cd,ef", // xx, is invalid
    "xx,ab,cd,cd,ef,ef,ef"  // xx, is invalid
};
List<String> list = Arrays.asList(inputs);
String regex = "(?=.*ab)(?=.*cd.*cd)(?=.*ef.*ef.*ef)[a-f]{2}(?:,[a-f]{2}){5}";

list.stream().forEach(x -> {
    if (x.matches(regex)) {
        System.out.println("MATCH:    " + x);
    }
    else {
        System.out.println("NO MATCH: " + x);
    }
});

这些指纹:

代码语言:javascript
复制
MATCH:    ab,ef,cd,ef,cd,ef
MATCH:    cd,cd,ef,ab,ef,ef
NO MATCH: ab,cd,ef
NO MATCH: ab,xx,ef,cd,ef,cd,ef
NO MATCH: xx,ab,cd,cd,ef,ef,ef
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60657114

复制
相关文章

相似问题

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