2009-08-24 21 views
2
    字符串的
  1. 最大长度为6。
  2. 该字符串应该含有至多2个数字
  3. 字符串应当含有最多4字母

所以下面的例子应该匹配正则表达式来验证至多2号和至多4个字母长度的字符串6

abcd22 

a1cd3d 

11acde 

a1c 

1ad 
+2

怎么样,没有数字,没有字母串字符? – 2009-08-24 19:18:36

+0

字符串可以包含比2度4的限制少了? “1a2”是否有效? – Amy 2009-08-24 20:57:03

+0

是其有效的,但没有串数字,没有字母是不是在这种情况下,有效 – kurozakura 2009-08-25 02:29:13

回答

1

你想要的东西在正则表达式中是不可能的,因为正则表达式不能计数,这在这里是需要的。实际上,正则表达式似乎能够以直接序列计数字符,例如,在这种情况下:

/x{2,3}/ # 2 or 3 ‘x’s 

...但是这其实还不算,因为它只是这个表情的快捷方式:

/xxx?/ 

即2 x的,跟着一个可选的第三个。

另一方面,您的表情必须跟踪表示表达式的整个自动机的两个不同计数器。这在经典的正则表达式中是不可能的(并且仍然很难使用更多的现代正则表达式使用下推自动机来保存状态)。

0

的正则表达式不擅长跟踪状态。你可以用正则表达式做到这一点,但它会更容易使用一个简单的计算器和小正则表达式程序:

bool IsValid(string s) 
{ 
    int numInts = 0; 
    int numChars = 0; 
    Regex isDigit = new Regex(@"\d"); 
    Regex isChar = new Regex(@"[a-zA-Z]"); // NOTE: will NOT catch non english letters 

    if (s.Length() <= 6) 
    { 
     return false; 
    } 

    foreach (char c in s) 
    { 
     if (isDigit.IsMatch(c)) 
     { 
      ++numInts; 
     } 
     if (isChar.IsMatch(c)) 
     { 
      ++numChars; 
     } 
    } 

    return numInts == 2 && numChars == 4; 

}

Constify /重命名参数传递给满足您的需求。

当然,如果你想成为一个非常喜欢的人,你可以在字符上进行数字比较,但这会进一步让你远离一个稳固的,强大的解决方案。

2

我做了一堆正则表达式中的一个或测试:

/^[a-z0-9]{0,6}$/ # at most 6 characters 
/([a-z].*){5}/ # more than 4 letters 
/(\d.*){3}/  # more than 2 digits 

所以:

if (/^[a-z0-9]{0,6}$/ and !(/([a-z].*){5}/ or /(\d.*){3}/)) { 
    print "valid"; 
} 
+0

“A/10”验证...... – 2009-08-24 19:27:36

+0

我没有看到任何问题,将意味着其他字符不应验证 – naumcho 2009-08-24 20:57:03

+0

最大应是4个字母和最多2个位数即字母<= 4和数字<= 2 – kurozakura 2009-08-25 02:34:07

1

我不会用正则表达式为这一个,也许除了检查字母/更少比6:/^[0-9a-z]{1,6}$/i。但计数条件,虽然使用正则表达式在技术上是可行的,但通过简单计数可以更好地完成。

,所以我会

  1. 测试它是否匹配正则表达式/^[0-9a-z]{1,6}$/i
  2. 然后用一个for循环计数chararcter CLASSE OCCURENCES
0

你可以做到这一点使用负向前看符号。

(?!\d{5})(?![a-z]{3})[a-z0-9]{1,6} 

(?!\d{5})如果5首或更多个数字被发现

(?![a-z]{3})如果这两个通的,我们终于验证有1首6个字母数字之间如果3个或更多的字符被发现

失败失败与(?!\d{5})(?![a-z]{3})[a-z0-9]{1,6}

相关问题