首页 > 解决方案 > 匹配连续的 2 位或 3 位

问题描述

我正在运行这个函数来生成一个包含 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
                        
                    }
                }
            }

标签: c#regexvb.net

解决方案


如果你想匹配所有好的值,你可以使用一个交替组合一个否定的前瞻,(?!排除右边的一些字符。

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

解释

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

正则表达式演示


推荐阅读