2016-01-18 10 views
4

我一直在试图解决这个问题一下,现在不得不转向问你罚款人。正则表达式需要匹配字母数字字符串与最小的一个数字向前看只检查第二个位置

我发现下面的正则表达式很多次,从我读过它应该工作,但实际上并没有似乎工作

\b(?=.\d)(?i)[a-z\d]{3,}\b 

它的问题是,如果有一个字母的即使字符串中有数字,也会失败。

所以60B15H逝者如斯它应该是,但6D15H失败,这不是我想要的

我对正则表达式的要求是,该字符串必须是字母,数字和遏制它可将任意位置至少一个数字数字。它不能包含所有字母或任何特殊字符。它至少需要3个字符。

回答

2

您可以使用

(?i)\b(?=[a-z]*\d)[a-z\d]{3,}\b 
     ^^^^^^^^^^^^ 

你需要告诉正则表达式引擎之后的任何信件,检查数字。 (?=[a-z]*\d) lookahead在每个主要字边界\b后面执行一次,并确保在一系列字母后至少有一个数字。

regex demo

+1

惊人的,工作一个魅力感谢像很多的答案。 – Fresh

+1

我只想说明Thomas的非正则表达式解决方案的工作方式与我的不同。字符类严格禁止所有字母和数字,但是ASCII字符。 “IsLetter”支持Unicode。根据要求,选择是你的。为了与正则表达式相同,可以使用'\ b(?= \ p {L} * \ d)[\ p {L} \ d] {3,} \ b'。 –

+0

那样会更有效率吗?我目前正在努力的方法,我正在努力提高其效率。 – Fresh

1

为什么要使用正则表达式时,你可以得到相同的简单代码:

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)); 
} 
相关问题