Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Regex:查找多个模式的所有匹配项_C#_Regex - Fatal编程技术网

C#Regex:查找多个模式的所有匹配项

C#Regex:查找多个模式的所有匹配项,c#,regex,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:这需要不区分大小写

我需要一个C#正则表达式的帮助,该正则表达式标识一个字符串中出现多少预定义的3字母字符串

例如:

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

["qwe", "wer", "ert", "rty"]
(当然,上面的正则表达式是不正确的!)

仅供参考,这是为了检查键盘上是否有3个连续字符出现在密码中(在上述情况下,
“qwerty”
是密码)

谢谢:)


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

如果您只想使用US键盘(请参阅s.m.注释),您可以尝试Linq而不是正则表达式:

结果:

qwe, wer, ert, rty

另一个Linq解决方案可实现我认为您需要的目标:

  • 我们将输入拆分为一段长度
  • 我们检查输入是否包含任何块


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

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)));
}

你可以积极地向前看

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

我不知道这对你有多重要,但即使你提出了一个有效的正则表达式,它仍然不包括非美国键盘。例如,即使它是基于
qwerty
布局,要考虑到我使用的意大利键盘,你必须包括
opè
pè+
klò
òù
m,.
M;:
;:_。另一个例子是斯洛文尼亚键盘,它的布局是
qwertZ
,因此会丢弃你的正则表达式。这不是正则表达式的工作方式,正则表达式并不是这里的最佳解决方案。@s.m.我同意键盘上连续3个字母作为密码检查的整个前提是愚蠢的。如何覆盖中文键盘。然而,修复给定的正则表达式至少是可能的。@ JGNI,我和你在这一点上是100%,我只是想提醒OP考虑本地化问题,如果他们没有这样做的话)因为它是我们正在讨论的密码,我不想让他们觉得他们有一个可靠的方法来保护愚蠢的人。谢谢,我该如何区分大小写?@JacobClayden我已经编辑了我的答案。谢谢你的帮助!:)按照OP的要求使用正则表达式做得很好,快来吧!是的,谢谢!这正是我想要的:)
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(x => rows.Any(y => CultureInfo.InvariantCulture.CompareInfo.IndexOf(y, x, CompareOptions.IgnoreCase) >= 0));
Regex.Matches("qwerty",@"(?i)(?=(qwe|wer|ert|rty|tyu|yui|uio|iop|op\[|p\[\])).")