簡體   English   中英

正則表達式匹配字符串內容直到評論

[英]regex to match string content until comment

我正在嘗試匹配字符串中[%___%]中包含的表達式,在// (注釋)之前,不包括//在引號中(在字符串內)
所以例如
[%tag%] = "a" + "//" + [%tag2%]; //[%tag3%]
應該匹配[%tag%][%tag2%]

我能得到的最接近的是^(?:(?:\[%([^%\]\[]*)%\])|[^"]|"[^"]*")*?(?://)

所以我遇到的問題是這不匹配任何不以//結尾的字符串
事實上,它會聚合行,直到它可以總結為包含//
我試圖在最后用?.*?$來解決這個問題,以表示//不是必需的,並將 go 到第一個端線,但它並沒有真正起作用。

其次,它只捕獲第二個標簽。 這不是因為"//" ,因為即使使用[%1%] [%2%]它也不會捕獲第一個

我正在使用 C# 和Regex.MatchesRegexOptions.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM