Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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# 正则表达式需要将字母数字字符串与一个数字的最小值相匹配,向前看只检查第二个位置_C#_Regex_Lookahead - Fatal编程技术网

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
。在这种情况下,您不会有性能问题。根据我的经验,如果你明智地使用正则表达式,就永远不会有性能问题。