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

4

我有一个如下的段落:

一些用于测试的用语 [!#today] ,其中 [!condition] 不满足这个措辞 [!ShowElemIf://Student/FullName; [[[Text not recognized fully]]];/名字] 但是找到了年龄为 [!ShowElemIf://Student/Age;xml//Student/DOB/@formatted;y] 的简单标记。

我需要使用C#查找上述所有占位符/标记,例如:[!tag]。我尝试使用正则表达式,但无法找到加粗的"FullName"单词作为标记。

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

使用这个正则表达式,我可以找到以下内容,但不能找到高亮部分。

  1. 今天
  2. 条件
  3. ShowElemIf://Student/Age;xml//Student/DOB/@formatted;y

你的模式末尾为什么有那么多空白空间? - juharr
@juharr: 我相信这是Visual Studio的怪癖,我已经在SO上看到过它,昨天在将文本粘贴到我的VS时也遇到了同样的问题。这只是一个复制/粘贴问题。 - Wiktor Stribiżew
是的。您可以将其视为打字错误。感谢@Wiktor的回答。 - sapatelbaps
1个回答

3

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

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

请查看 正则表达式演示 细节
- \[! - 匹配 [! 子字符串; - ((?:[^][]+|(?<o>\[)|(?<-o>)])*(?(o)(?!))) - 捕获组 1 匹配:
- (?: - 一个非捕获组有 3 种可能:
- [^][]+| - 匹配 1 个或多个不是 [] 的字符,或者 - (?<o>\[)| - 将一个 [ 推入 "o" 组堆栈中,或者 - (?<-o>)] - 从 "o" 组堆栈中减去一个 ] - )* - 重复零次或更多次; - (?(o)(?!))) - 一个条件构造,检查 "o" 组堆栈是否为空。如果为空,则继续匹配,否则返回无匹配项。 - ] - 一个字面上的闭合 ] 符号。

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