2012-11-03 32 views
1

我需要满足这一说法正则表达式:匹配至少一个字符和一个数字,不管顺序如何,没有后缀?

至少有一个字符和一个数字,不论顺序,并在年底有没有后缀(即域名)。

所以我有这样的测试列表:

ra182 
jas182 
ra1z4 

我有这个表达式:

[a-z]+[0-9]+$ 

它完全符合前两个,但它只是在最近匹配z4一。虽然它对我来说很有意义,为什么它只匹配最后一个条目的那一部分,但我需要一点帮助才能完成这个任务。

回答

4

您可以向前看符号检查前两个条件:

/^(?=.*[a-z])(?=.*[0-9])/i 

...如果第三个是几乎没有.,它是简单的检查太:

/^(?=.*[a-z])(?=.*[0-9])[^.]+$/i 

但我可能更愿意使用三个单独的测试:首先检查符号(您确定只需检查一个范围 - [az] - 而不是Unicode Letter属性?),第二个用于数字,和这个讨厌的点的最后一个,像这样:

if (Regex.IsMatch(string, "[a-zA-Z]") 
    && Regex.IsMatch(string, "[0-9]") 
    && ! Regex.IsMatch(string, @"\.")) 
{ 
    // string IS valid, proceed 
} 

问题中的正则表达式会尝试匹配一个或多个符号,后跟一个或多个数字;它显然会失败,像9a这样的字符串。

+1

第一个可能也会受益于'^',我认为在lookahead中的所有'。*'都是不必要的。 –

+0

会使用第一个,'$'(这是一个字符串的末尾?)工作,以确保他们不能追加任何后缀? –

+1

@BigM不会再匹配任何东西,因为那么这个预测将会从字符串的末尾开始,在那里它们不能再匹配 –

-1

您需要匹配至少包含一个字母和一个数字的字母数字字符串吗?尝试这样:

\w*[a-z]\w*[0-9]\w* 

这将确保您至少有一个字母和一个数字,字母后面的数字。如果你想在字母前考虑数字,只需使用相应的表达式g(字母前的数字)和|这两个。

0

我建议使用

Match match = Regex.Match(str, @"^(?=.*[a-zA-Z])(?=.*\d)(?!.*\.).*"); 

Match match = Regex.Match(str, @"^(?=.*[a-zA-Z])(?=.*\d)(?!.*[.]).*"); 

Match match = Regex.Match(str, @"^(?=.*[a-zA-Z])(?=.*\d)[^.]*$"); 

Match match = Regex.Match(str, @"^(?=.*[a-zA-Z])[^.]*\d[^.]*$"); 

if (match.Success) ... 
相关问题