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

Posted

技术标签:

【中文标题】C#正则表达式匹配方括号【英文标题】:C# regular expression to match square brackets 【发布时间】:2013-06-18 08:55:57 【问题描述】:

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

【问题讨论】:

这是匹配整个字符串还是这个版本号在句子中间? 【参考方案1】:

这是因为正则表达式匹配字符串的一部分,而您没有告诉它强制匹配整个字符串。此外,您可以大大简化您的正则表达式(例如,您不需要所有这些 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。

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

【讨论】:

【参考方案2】:

您需要使用^$ 锚定正则表达式

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 = @"^\d2\.([1-9]\d?\.)2[1-9]\d0,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 等同于 \pNd,因此也会匹配 "١٢٣" 和其他数字,除非您使用 RegexOptions.ECMAScript 编译正则表达式。

以上是关于C#正则表达式匹配方括号的主要内容,如果未能解决你的问题,请参考以下文章

用于匹配嵌套括号内的特定文本的 C# 正则表达式

c# 正则表达式 匹配中括号&颜色过滤

C# 正则表达式 - 为括号内的单个模式查找一个或多个匹配项

c#用正则表达式提取小括号中的内容

如何编写 C# 正则表达式模式以匹配基本的 printf 格式字符串,如“%5.2f”?

如何用正则表达式匹配括号中的内容,不包含括号