C#Regex:查找多个模式的所有匹配项
我需要一个C#正则表达式的帮助,该正则表达式标识一个字符串中出现多少预定义的3字母字符串 例如: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:这需要不区分大小写
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,.
,,,pè
,Lè
,,代码>,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\[\])).")