正则表达式从具有多个方括号的字符串中查找匹配项

Posted

技术标签:

【中文标题】正则表达式从具有多个方括号的字符串中查找匹配项【英文标题】:Regex to find matches from a string having multiple square brackets 【发布时间】:2017-08-25 17:20:26 【问题描述】:

我有如下一段:

一些用于测试 [!#today] 的措辞,其中 [!condition] 不满足这种措辞 [!ShowElemIf://Student/FullName; [[[无法完全识别文本]]] ;/First Name] 但发现简单标签具有年龄 [!ShowElemIf://Student/Age;xml//Student/DOB/@formatted;y]

我需要从上面找到所有占位符/标签,例如:[!tag] 使用 C#。我尝试了一个正则表达式,但它找不到上面以粗体突出显示的带有“FullName”字样的标签。

List<string> tags = Regex.Matches(
                     sampleText.Replace(Environment.NewLine, ""), @"\[!([^]]+)\]	")
                     .Cast<Match>()
                     .Select(x => x.Groups[1].Value)
                     .ToList();

使用这个正则表达式,我可以在下面找到但不是突出显示的那个。

    今天 条件 ShowElemIf://Student/Age;xml//Student/DOB/@formatted;y

【问题讨论】:

为什么你的图案末尾有那么多空白? @juharr:我相信这是 Visual Studio 的一个怪癖,我已经在 SO 看到过,昨天在我的 VS 中粘贴文本时也遇到了同样的问题。这只是一个复制/粘贴问题。 是的。您可能会将其视为拼写错误。感谢@Wiktor 的回答。 【参考方案1】:

您需要使用 .NET 正则表达式中提供的平衡组

@"\[!((?:[^][]+|(?<o>\[)|(?<-o>)])*(?(o)(?!)))]"

见regex demo

详情

\[! - [! 子字符串 ((?:[^][]+|(?&lt;o&gt;\[)|(?&lt;-o&gt;)])*(?(o)(?!))) - 捕获组 1 匹配 (?: - 具有 3 个备选方案的非捕获组: [^][]+| - 除[] 之外的1 个或多个字符,或 (?&lt;o&gt;\[)| - 一个 [ 被推入“o”组堆栈,或 (?&lt;-o&gt;)] - 从“o”组堆栈中减去 ] )* - 零次或多次出现 (?(o)(?!))) - 检查“o”组堆栈是否为空的条件构造。如果为空,则继续匹配,否则不返回匹配项。 ] - 文字结束 ] 符号。

【讨论】:

以上是关于正则表达式从具有多个方括号的字符串中查找匹配项的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式在嵌套括号外查找匹配项

使用正则表达式查找两个字符串之间的多个匹配项

如何使用正则表达式查找具有特定起始字符串的所有匹配项? [复制]

js正则表达式

JavaScript 正则

JavaScript 正则