C# 正则表达式需要将字母数字字符串与一个数字的最小值相匹配,向前看只检查第二个位置
我已经试着解决这个问题有一段时间了,现在不得不求助于问你们这些优秀的人 我已经多次发现下面的正则表达式模式,从我所读到的内容来看,它应该可以工作,但实际上似乎不起作用C# 正则表达式需要将字母数字字符串与一个数字的最小值相匹配,向前看只检查第二个位置,c#,regex,lookahead,C#,Regex,Lookahead,我已经试着解决这个问题有一段时间了,现在不得不求助于问你们这些优秀的人 我已经多次发现下面的正则表达式模式,从我所读到的内容来看,它应该可以工作,但实际上似乎不起作用 \b(?=.\d)(?i)[a-z\d]{3,}\b 问题是,如果字符串的第二个位置有字母,即使字符串中有数字,也会失败 所以60B15H像应该的那样通过,但6D15H失败了,这不是我想要的 我对正则表达式的要求是字符串必须是字母数字,并且在任何位置至少包含一个数字,可以是所有数字。它不能包含所有字母或任何特殊字符。它至少需要3
\b(?=.\d)(?i)[a-z\d]{3,}\b
问题是,如果字符串的第二个位置有字母,即使字符串中有数字,也会失败
所以60B15H像应该的那样通过,但6D15H失败了,这不是我想要的
我对正则表达式的要求是字符串必须是字母数字,并且在任何位置至少包含一个数字,可以是所有数字。它不能包含所有字母或任何特殊字符。它至少需要3个字符长。您可以使用
(?i)\b(?=[a-z]*\d)[a-z\d]{3,}\b
^^^^^^^^^^^^
您需要告诉正则表达式引擎检查任何字母后的数字。(?=[a-z]*\d)
在每个前导字边界\b
后执行一次先行检查,并确保字母序列后至少有一个数字
请参见当您可以通过简单代码获得相同的结果时,为什么要使用正则表达式:
public static bool isValid(string input)
{
if(input.Length < 3 || input.All(c => char.IsLetter(c)))
{
return false;
}
return input.All(c => char.IsLetterOrDigit(c));
}
公共静态bool有效(字符串输入)
{
if(input.Length<3 | | input.All(c=>char.isleter(c)))
{
返回false;
}
返回input.All(c=>char.isleterordigit(c));
}
这真是太神奇了,非常感谢你的回答。我只想指出,Thomas的非正则表达式解决方案的工作原理与我的不同。字符类严格禁止除ASCII以外的所有字母和数字Isleter
支持Unicode。根据需要,您可以选择。要在正则表达式中实现同样的效果,可以使用\b(?=\p{L}*\d)[\p{L}\d]{3,}\b
。这样会更有效吗?我目前正在研究的方法,我正在努力提高它的效率。你应该测试和检查什么更有效。如果您多次使用regex,只需将其声明为公共静态只读字段并使用RegexOptions.Compiled
。在这种情况下,您不会有性能问题。根据我的经验,如果你明智地使用正则表达式,就永远不会有性能问题。