正则表达式:匹配非连续的字符串

4

我正在尝试理解如何匹配存储在数组中的特定字符串(该字符串始终为3个字符长,例如:123、568、458等),并将该字符串与任意顺序的较长字符串(例如9841273)进行匹配。是否有可能检查这三个字符中至少有2个字符匹配(在此示例中)strMoves?请参见下面的代码以了解详细信息。

    private readonly string[] strSolutions = new string[8] { "123", "159", "147", "258", "357", "369", "456", "789" };
    Private Static string strMoves = "1823742"

    foreach (string strResult in strSolutions)
       {
            Regex rgxMain = new Regex("[" + strMoves + "]{2}");
            if (rgxMain.IsMatch(strResult))
            {
                MessageBox.Show(strResult);
            }
        }

我在正则表达式中指定的“{2}”部分,是期望结果至少匹配两个字符的位置,但我的逻辑有缺陷。只有当这两个字符按照字符串 strResult 中的顺序相邻时,才会返回 true。如果不是正确的顺序,则会返回 false。我将继续研究,但如果有任何人知道在 Microsoft 文档中需要查找什么内容,那将非常感谢!
正确的顺序会返回 true:"144257" 匹配到 "123" 不正确的顺序:"35718" 匹配到 "123" 3 在 1 前面,所以不匹配。

数组和字符串都在类作用域下定义。 - Patrick
1
尝试使用new Regex($@"([{strMoves}]).*(?!\1)[{strMoves}]") - Wiktor Stribiżew
这段代码是有效的,但我不太理解其中的“(?!\1)”部分。这是在对字符串进行分组吗? - Patrick
(?!\1)是一个负向前瞻,确保第二次出现的strMoves模式不会与其第一次匹配的相同字符匹配。如果有效,请考虑接受下面的答案。此外,如果您仍需要澄清某些内容,请通过答案下方的评论告知。 - Wiktor Stribiżew
1个回答

1
如果您需要在较长的字符串中找到至少两个来自指定集合的不同(不一定连续)字符,可以使用以下解决方案:
new Regex($@"([{strMoves}]).*(?!\1)[{strMoves}]", RegexOptions.Singleline)

它将会看起来像这样:
([1823742]).*(?!\1)[1823742]

请查看正则表达式演示

模式细节

  • ([1823742]) - 捕获组 1:字符类中的任一字符
  • .* - 任意零个或多个字符,尽可能多地匹配(由于使用了RegexOptions.Singleline.可以匹配包括换行符在内的任何字符)
  • (?!\1) - 负向先行断言,如果下一个字符是存储在第一组记忆缓冲区中的值的起点(因为这里只有一个字符,所以下一个字符不应该等于组1中的文本,即指定的数字之一),则匹配失败
  • [1823742] - 字符类中的任一字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接