正则表达式 - 在C#中匹配两个字母和两个数字

27

我正在尝试开发一个正则表达式来验证像“TE33”或“FR56”这样的字符串,或者任何符合2个字母和2个数字的序列。

前2个字符必须是字母,后2个字符必须是数字。

我尝试了许多组合,但都没有成功。我最后尝试的一个是:

if(Regex.IsMatch(myString, "^[A-Za-z]{2}[0-9]{2}")){
}

我总是在正则表达式测试网站上进行排序,然后使用从交互式测试中知道有效的内容进入vs.net。 - William Dwyer
5
一个好的测试网站可以帮助你完成这些任务,例如http://regexhero.net/tester/。 - Bryan Crosby
什么问题?对我来说它可以工作。 - user1108948
@Dan-SP,你的字符串值周围是否也有空格?在匹配之前考虑使用myString.Trim()... - Alexei Levenkov
@SteveWortham:是的,我注意到了。但是我给出的链接并不会试图向你销售任何东西。 - Matt Burland
显示剩余4条评论
3个回答

45
你缺少一个结束锚点。
if(Regex.IsMatch(myString, "^[A-Za-z]{2}[0-9]{2}\z")) {
    // ...
}

这里有一个演示。


编辑:如果你可以在首2个字母和最后2个数字之间包含任何内容:

if(Regex.IsMatch(myString, @"^[A-Za-z]{2}.*\d{2}\z")) {
    // ...
}

这里有一个演示。


除非您真的需要拒绝任何超出预期长度的字符串,否则这并不重要。 - Matt Burland
这也符合末尾没有锚点的情况,可能还有其他问题。http://ideone.com/wZk6B - William Dwyer
@WilliamDwyer: 不好意思,我选择了一些不好的测试案例。没有锚点的话,对于像AB12 I am invalid这样的字符串,它将会失败。但是我可能对问题有误解,所以我添加了一个备选方案。 - Ry-
-1,会允许字符串末尾有\n。请使用\z代替。 - Qtax

8
这应该能为您提供从两个字母开始到两个数字结束的起点。
[A-Za-z]{2}(.*)[0-9]{2}

如果你知道它永远只会是两个和两个,那么你可以

[A-Za-z]{2}[0-9]{2}

5

仅供娱乐,这里提供一种非正则表达式的解决方案(对于像我这样的初学者更易读和维护):

string myString = "AB12";

if( Char.IsLetter(myString, 0) && 
    Char.IsLetter(myString, 1) && 
    Char.IsNumber(myString, 2) &&
    Char.IsNumber(myString, 3)) {
    // First two are letters, second two are numbers
}
else {
    // Validation failed
}

编辑

看起来我误解了需求。下面的代码将确保字符串的前两个字符和后两个字符验证成功(只要字符串的长度> 3)。

string myString = "AB12";

if(myString.Length > 3) {    
    if( Char.IsLetter(myString, 0) && 
        Char.IsLetter(myString, 1) && 
        Char.IsNumber(myString, (myString.Length - 2)) &&
        Char.IsNumber(myString, (myString.Length - 1))) {
        // First two are letters, second two are numbers
      }
      else {
        // Validation failed
    }
}
else {
   // Validation failed
}

请注意,IsLetter比A-Z要广泛得多。您还可以使用相同的检查方式来检查数字。 - Alexei Levenkov
@AlexeiLevenkov,已经注意到A-Z。我以前从未使用过Char.IsNumber。感谢您的提醒(已更新代码)! - James Hill
@JamesHill,这就是OP表达式的问题所在...请查看得票最高的答案。 "validate a string that comes to me like: "TE33" or "FR56" or any sequence respecting 2 letters and 2 numbers", 那么TE3345FAIL又是怎么符合条件呢? - Qtax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接