2017-03-31 586 views
4

我有一段像下面找到匹配:[!#today] [!条件]!正则表达式从字符串中有多个方括号

一些措辞进行测试,其中不符合此空话[满足ShowElemIf ://学生/全名; [[[文本不承认完全]]]; /名]但简单的标记发现有年龄[ShowElemIf://学生/年龄; XML //学生/ DOB/@格式化; Y]

我需要从上面找到所有的占位符/标签,就像使用C#的[!标签]一样。我尝试了一个正则表达式,但它无法找到具有“FullName”单词的标签,如上面粗体突出显示的那样。

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

使用这个表达式我之下,但找不到一个突出的。

  1. 今天
  2. 条件
  3. ShowElemIf://学生/年龄; XML //学生/ DOB/@格式化; Y
+0

为什么你在模式结尾处有所有的空白空间? – juharr

+0

@juharr:我相信这是一个Visual Studio的怪癖,我已经看到它已经在SO,并且在将文本粘贴到我的VS中时也得到了相同的问题。这只是一个复制/粘贴问题。 –

+0

是的。你可能会认为它是错误的错误。感谢@ Wiktor为您的答案。 – sapatelbaps

回答

3

您需要使用可用平衡组。 NET正则表达式:

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

regex demo

详细

  • \[! - 一个[!
  • ((?:[^][]+|(?<o>\[)|(?<-o>)])*(?(o)(?!))) - 捕获组1匹配
    • (?: - 3个替代品的非捕获组:
      • [^][]+| - 一个或多个字符她的比[],或
      • (?<o>\[)| - 一个[推入 “o” 的组堆叠或
      • (?<-o>)] - 一个]从 “○” 组堆叠减去
    • )* - 零个或更多发生
    • (?(o)(?!))) - 检查“o”组堆栈是否为空的条件构造。如果它为空,则匹配继续,否则,不会返回匹配。
  • ] - 字面收盘]符号。