C#正则表达式:查找多种模式的所有匹配项

时间:2018-10-04 14:28:55

标签: c# regex

我需要有关C#中的正则表达式的帮助,该正则表达式可确定一个字符串中出现了多少个预定义的3个字母的字符串。

例如,

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

会返回:

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

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

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

谢谢:)

编辑1:这必须不区分大小写。

4 个答案:

答案 0 :(得分:0)

如果您只想使用美式键盘(请参见s.m.注释),则可以尝试使用 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

答案 1 :(得分:0)

另一种Linq解决方案,可以实现我认为您正在寻找的东西:

  • 我们将输入拆分为Length的一部分
  • 我们检查输入内容是否包含任何块

Try it Online!

public static bool ContainsAnySubstring(string predifined, int length, string input)
{
    var sections = predifined.Remove(predifined.Length - length + 1).Select((_,i) => predifined.Substring(i, length));
    return sections.Any(section => input.Contains(section));
}

public static void Main()
{
    Console.WriteLine(ContainsAnySubstring("qwerty", 3, "azerty") == true);
    Console.WriteLine(ContainsAnySubstring("qwerty", 5, "azerty") == false);
}

答案 2 :(得分:0)

代替使用正则表达式,您只需获取输入的每个子字符串,然后检查它是否是键盘布局的子字符串:

IEnumerable<string> FindContinuousKeyInputs(string input, int length = 3)
{
    if (length <= 0)
        throw new ArgumentException(nameof(length));

    if (input.Length < length)
        return Enumerable.Empty<string>();

    var rows = new string[]
    {
        @"qwertyuiop[]\",
        "asdfghjkl;'",
        "zxcvbnm,./"
    };

    return Enumerable.Range(0, input.Length - length + 1)
        .Select(x => input.Substring(x, length))
        .Where(x => rows.Any(y => y.Contains(x)));
}

对于不区分大小写的情况,请用以下内容替换最后一个Where

.Where(x => rows.Any(y => CultureInfo.InvariantCulture.CompareInfo.IndexOf(y, x, CompareOptions.IgnoreCase) >= 0));

答案 3 :(得分:0)

您可以使用积极的前瞻方式

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