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

4
我正在尝试使用C#中的正则表达式来匹配软件版本号,该版本号可以包含以下内容:
  • 两位数
  • 一位或两位数字(不以0开头)
  • 另一个一位或两位数字(不以0开头)
  • 一到五位数字(不以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)?


这是匹配整个字符串还是版本号在句子中间? - Bob Vale
2个回答

7
这是因为正则表达式只匹配了字符串的一部分,而你没有告诉它强制匹配整个字符串。此外,你可以大大简化你的正则表达式(例如,你不需要所有那些捕获组:)。
string rex = @"^[0-9]{2}\.[1-9][0-9]?\.[1-9][0-9]?\.[1-9][0-9]{0,4}(?:\[[a-zA-Z]\])?$";

^$锚点,它们匹配字符串的开头和结尾。

你提到的错误信息与需要转义反斜杠有关,如果不使用原样字符串,则也需要转义反斜杠。因此,正则表达式中的文字左括号可以被匹配为"[[]""\\["@"\["。推荐使用后一种形式。


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.26812此处应为错误的原因是它匹配了子字符串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]\])?$";

小心,在.NET中,\d等同于\p{Nd},因此也会匹配“١٢٣”和其他数字,除非您使用RegexOptions.ECMAScript编译正则表达式。 - Tim Pietzcker

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