3

我正在尝试在 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 )?

4

2 回答 2

4

发生这种情况是因为正则表达式匹配字符串的一部分,而您没有告诉它强制匹配整个字符串。此外,您可以大大简化您的正则表达式(例如,您不需要所有这些捕获组

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

^and$是匹配字符串开头和结尾的锚点

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

于 2013-06-21T09:28:50.377 回答
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]\])?$";
于 2013-06-21T09:29:33.157 回答