4

我试图了解如何匹配数组中保存的特定字符串(此字符串将始终为 3 个字符长,例如:123、568、458 等),我会将该字符串与更长的字符串匹配可以按任何顺序(例如 9841273)。是否可以检查字符串中 3 个字符中的至少 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);
            }
        }

我在 Regex 中指定“{2}”的部分是我希望结果检查至少 2 个匹配字符的地方,但我的逻辑肯定有缺陷。如果与 strResult 中的字符串相比,这两个字符的顺序是连续的,它将返回 true。如果它的顺序不正确,它将返回 false。我将继续对此进行研究,但如果有人对在哪里查看 Microsoft 文档有任何想法,那将不胜感激!

返回 true 的正确顺序:“ 1 44 2 57”匹配“123” 错误顺序:“ 3 57 1 8”匹配“123” 3 在 1 之前,因此不匹配。

4

1 回答 1

1

如果您需要从较长的字符串中的指定集合中找到至少两个不同的不一定连续的字符,则可以使用以下解决方案:

new Regex($@"([{strMoves}]).*(?!\1)[{strMoves}]", RegexOptions.Singleline)

它看起来像

([1823742]).*(?!\1)[1823742]

请参阅正则表达式演示

图案细节

  • ([1823742])- 捕获组 1:字符类中的字符之一
  • .*- 尽可能多的任何零个或多个字符(由于RegexOptions.Singleline,.匹配任何字符,包括换行符)
  • (?!\1)- 如果下一个字符是存储在第 1 组内存缓冲区中的值的起点,则匹配失败的负前瞻(因为这里是单个字符,下一个字符不应等于第 1 组中的文本,其中一个指定的数字)
  • [1823742]- 字符类中的字符之一。
于 2020-09-28T19:51:20.653 回答