我需要有关C#中的正则表达式的帮助,该正则表达式可确定一个字符串中出现了多少个预定义的3个字母的字符串。
例如,
Regex.Matches("qwerty", @"(?i)(qwe|wer|ert|rty|tyu|yui|uio|iop|op\[|p\[\])")
会返回:
["qwe", "wer", "ert", "rty"]
(但是上面的正则表达式当然不正确!)
仅供参考,这是为了检查密码中键盘上是否连续出现了3个字符(在"qwerty"
以上的情况下为密码。
谢谢:)
编辑1:这必须不区分大小写。
答案 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解决方案,可以实现我认为您正在寻找的东西:
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\[\])).")