C#正则表达式匹配方括号

时间:2013-06-21 09:17:41

标签: regex square-bracket

我正在尝试在C#中使用正则表达式来匹配可以包含的软件版本号:

  • 一个2位数字
  • 1位或2位数字(不以0开头)
  • 另一个1或2位数字(不是从0开始)
  • 1,2,3,4或5位数字(不以0开头)
  • 方括号内的选项字母。

一些例子:

10.1.23.26812
83.33.7.5
10.1.23.26812[d]
83.33.7.5[q]

无效的例子:

10.1.23.26812[
83.33.7.5]
10.1.23.26812[d
83.33.7.5q

我尝试了以下内容:

string rex = @"[0-9][0-9][.][1-9]([0-9])?[.][1-9]([0-9])?[.][1-9]([0-9])?([0-9])?([0-9])?([0-9])?([[][a-zA-Z][]])?";

(注意:如果我在没有“@”的情况下尝试,只需通过“\ [”转义方括号,我会收到错误说“无法识别的转义序列”)

我可以达到版本号正确验证的程度,但它接受之后发生的任何事情(例如:“10.1.23.26812thisShouldBeWrong”匹配正确)。

所以我的问题是:有没有办法使用正则表达式来匹配/检查字符串中的方括号,还是需要将其转换为不同的字符(例如:将[a]更改为 a 并匹配* s代替)?

2 个答案:

答案 0 :(得分:3)

这是因为正则表达式匹配部分字符串,并且您没有告诉它强制整个字符串匹配。此外,您可以大量简化正则表达式(例如,您不需要所有capturing groups

string rex = @"^[0-9]{2}\.[1-9][0-9]?\.[1-9][0-9]?\.[1-9][0-9]{0,4}(?:\[[a-zA-Z]\])?$";

^$anchors,匹配字符串的开头和结尾。

如果不使用逐字字符串,则提到的错误消息与您需要转义反斜杠的事实有关。因此,正则开头括号可以在正则表达式中与"[[]""\\["@"\["匹配。后一种形式是首选。

答案 1 :(得分:0)

您需要使用^$

来锚定正则表达式
string rex = @"^[0-9][0-9][.][1-9]([0-9])?[.][1-9]([0-9])?[.][1-9]([0-9])?([0-9])?([0-9])?([0-9])?([[][a-zA-Z][]])?$";

10.1.23.26812thisShouldBeWrong匹配的原因是因为它匹配子字符串10.1.23.26812

为了便于阅读,可以略微简化正则表达式

string rex = @"^\d{2}\.([1-9]\d?\.){2}[1-9]\d{0,4}(\[[a-zA-Z]\])?$";

回应TimCross警告 - 更新正则表达式

string rex = @"^[0-9]{2}\.([1-9][0-9]?\.){2}[1-9][0-9]{0,4}(\[[a-zA-Z]\])?$";