2017-03-31 240 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」組堆棧是否爲空的條件構造。如果它爲空,則匹配繼續,否則,不會返回匹配。
  • ] - 字面收盤]符號。
相關問題