首页 > 解决方案 > C# 正则表达式:查找多个模式的所有匹配项

问题描述

我需要 C# 中的正则表达式的帮助,它可以识别字符串中出现了多少个预定义的 3 字母字符串。

因此,例如:

Regex.Matches("qwerty", @"(?i)(qwe|wer|ert|rty|tyu|yui|uio|iop|op\[|p\[\])")

将返回:

["qwe", "wer", "ert", "rty"]

(当然,上面的正则表达式是不正确的!)。

仅供参考,这是检查键盘上的 3 个连续字符是否出现在密码中(在上面的情况下"qwerty"是密码。

谢谢 :)

编辑1:这需要不区分大小写。

标签: c#regex

解决方案


如果您只想使用美式键盘(请参阅 sm 评论),您可以尝试Linq而不是Regex

using System.Linq;

...

string source = "qwerty";

// either put chunks to test direct
string[] chunks = new string[] { 
  "qwe", "wer", "ert", "rty", "tuy", "yui", "uio", "iop", "op[", "p[]", "[]\\"};

// ...or generate them as 3-grams:
// string line = "qwertyuiop[]\\";
// string[] chunks = Enumerable
//   .Range(0, line.Length + 1 - 3)
//   .Select(start => line.Substring(start, 3))
//   .ToArray();

string[] appeared = chunks
  .Where(chunk => source.IndexOf(chunk, StringComparison.OrdinalIgnoreCase) >= 0)
  .ToArray();

Console.Write(string.Join(", ", appeared));

结果:

qwe, wer, ert, rty

推荐阅读