[英]regex to match string content until comment
我正在嘗試匹配字符串中[%___%]
中包含的表達式,在//
(注釋)之前,不包括//
在引號中(在字符串內)
所以例如[%tag%] = "a" + "//" + [%tag2%]; //[%tag3%]
應該匹配[%tag%]
和[%tag2%]
我能得到的最接近的是^(?:(?:\[%([^%\]\[]*)%\])|[^"]|"[^"]*")*?(?://)
所以我遇到的問題是這不匹配任何不以//
結尾的字符串
事實上,它會聚合行,直到它可以總結為包含//
我試圖在最后用?.*?$
來解決這個問題,以表示//
不是必需的,並將 go 到第一個端線,但它並沒有真正起作用。
其次,它只捕獲第二個標簽。 這不是因為"//"
,因為即使使用[%1%] [%2%]
它也不會捕獲第一個
我正在使用 C# 和Regex.Matches
與RegexOptions.Multiline
選項,這是我的轉義字符串
"^(?:(?:\\[%([^%\\]\\[]*)%\\])|[^\"]|\"[^\"]*\")*?(?://)"
首先,讓我說我喜歡正則表達式。 幾年前我讀過Friedl 的 Mastering Regular Expressions並且從未回頭。 話雖如此,不要使用一個巨大的正則表達式來解決這個問題。 使用您的編程語言。 您最終會得到更具可讀性和可維護性的代碼。 看起來您正在嘗試在這里解析一種語言,其中不同的規則適用於不同的上下文。 您的模式可能出現在帶引號的字符串中。 帶引號的字符串可能在其中包含需要轉義的引號。 在一個正則表達式中捕捉所有細微之處將是一場噩夢。 我建議逐個字符地遍歷字符串,沿途構建標記,查找引號,並跟蹤您是否在帶引號的字符串中。 當您遇到與您的條件匹配的令牌(您可以為此部分使用正則表達式)並且您不在字符串中時,請將其添加到您的列表中。 當您到達語句的末尾並遇到注釋的開頭時,請丟棄剩余的字符,直到注釋結束。
我認為一次性做到這一點有點困難,因為雙引號匹配很難檢查。 您可以分兩個階段進行:
¤ 刪除所有匹配的雙引號
¤ 尋找你的模式
Regex re1 = new Regex(@"""[^""]*""", RegexOptions.Multiline);
Regex re2 = new Regex(@"(?<!//.*)\[%\w+%\]", RegexOptions.Multiline);
string input = @"[%tag%] = ""a"" + ""//"" + [%tag2%]; //[%tag3%]
[%tag%] = ""a"" + ""ii//"" + [%tag2%]; //[%tag3%]";
MatchCollection ms = re2.Matches(re1.Replace(input, ""));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.