【问题标题】:Match consecutive 2 digit or 3 digit匹配连续的 2 位或 3 位
【发布时间】:2021-07-24 21:53:26
【问题描述】:

我正在运行这个函数来生成一个包含 256 个单词的单词表。然后我使用第二个声明过滤掉错误匹配,我只剩下 54 个单词。我正在寻找一种使用正则表达式或其他方式来匹配它的方法,以便它看起来干净而不那么草率。任何帮助将不胜感激。

GenerateStrings(new char[] { 'D', 'U' }, 8);

        public IEnumerable<String> GenerateStrings(IEnumerable<char> characters, int length) {
        if (length > 0) {
            foreach (char c in characters) {
                foreach (String suffix in GenerateStrings(characters, length - 1)) {
                    yield return c + suffix;
                }
            }
        } else {
            yield return string.Empty;
        }
    }


            
            if (!eachWord.Contains("UUUUU") && !eachWord.Contains("DDDDD") && !eachWord.Contains("UUUUD") && !eachWord.Contains("DDDDU") && !eachWord.Contains("UUUDDDD") && !eachWord.Contains("DDDUUUU")) {
                if (!eachWord.StartsWith("UUUU") && !eachWord.StartsWith("DDDD")) {
                    if (eachWord.StartsWith("UUDD") || eachWord.StartsWith("DDUU") || eachWord.StartsWith("DDUUU") ||
                            eachWord.StartsWith("UUDDD") || eachWord.StartsWith("DDDUU") || eachWord.StartsWith("UUUDD") ||
                            eachWord.StartsWith("DUUDD") || eachWord.StartsWith("DDDUU") || eachWord.StartsWith("DDDUUU") ||
                            eachWord.StartsWith("DUUDDD") || eachWord.StartsWith("DDDDUU") || eachWord.StartsWith("DUUUDD") ||
                            eachWord.StartsWith("UUUDD") || eachWord.StartsWith("UDDUU") || eachWord.StartsWith("UDDUUU") ||
                            eachWord.StartsWith("UUUDDD") || eachWord.StartsWith("UDDDUU") || eachWord.StartsWith("UUUUDD")) {

                            //good word
                        
                    }
                }
            }

【问题讨论】:

  • 过滤器背后的逻辑是什么?因为有类似的模式被包括在内和被排除在外。一些单词和示例输出或过滤器背后的逻辑将对我们有所帮助。
  • 每次我试图解释它时没有人理解它所以我只是发布了过滤器..所以基本上任何连续的 2 或 3 位数字,如 UUDD 或 UUDDD 或 DDDUUU 但不是 UUDUU
  • 你的意思是这样吗? U{2,3}D{2,3}(?!D)|D{2,3}U{2,3}(?!U)regex101.com/r/rfiq69/1
  • @Thefourthbird 我得到 108 个结果而不是 54 个
  • 你能把所有的名字都添加到regex101.com 链接并在这里分享并指出哪些应该匹配吗?

标签: c# regex vb.net


【解决方案1】:

如果您想匹配所有好的值,您可以将替代与否定前瞻 (?! 组合使用,不包括右侧的一些字符。

^(?:D?UUU?DD(?!DD)|U?DDD?UUU?(?!U))[UD]+$

说明

  • ^ 字符串开始
  • (?:非捕获组
    • D?UUU?DD(?!DD) 匹配可选的D,然后是UU 和可选的U,然后直接向右匹配DD 和assert not DD
    • |或者
    • U?DDD?UUU?(?!U) 匹配可选的U,然后匹配DD 和可选的D,然后匹配UU 和可选的U,断言不是U 直接向右。
  • )关闭非捕获组
  • [UD]+ 匹配 1 次以上 UD
  • $字符串结束

Regex demo

【讨论】:

    【解决方案2】:

    检查以下代码。我想这就是您正在寻找的模式。

            string[] arrSTr ={"UUDUU", "UUDDD", "UUUDD", "DDDUUU", "UUUDDD","DDUDD"};
            foreach(string s in arrSTr)
            {
                foreach (Match x in Regex.Matches(s, "[U]{2,}[D]{2,}|[D]{2,}[U]{2,}"))
                {
                    if (!x.Success) { continue; }
                    Console.WriteLine(x.Value);
                }
            }
    

    我尝试并测试了https://regex101.com/ 中的正则表达式。

    感谢@The Fourth Bird 提供关于 | 的想法。

    【讨论】:

    • 我得到 128 个结果而不是 54 个
    • @XK8ER 这个逻辑对我来说似乎很奇怪。 UDUUUDDD 不好,但 UDDUUUDU 很好。 UUUDDD 匹配 3 个连续的描述。所以一定是好的。我在这里很困惑。
    • 我知道这很令人困惑,为什么我很难解释,但我在这里发布了好的和坏的 regex101.com/r/FBo0Km/1
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多