2011-06-06 33 views
1

我想匹配的字符串包含在[%___%] expresions,前//(評論),不包括//是在報價單(在字符串中)
因此,例如
[%tag%] = "a" + "//" + [%tag2%]; //[%tag3%]
應該匹配[%tag%][%tag2%]正則表達式匹配的字符串內容,直到評論

最接近我可以是^(?:(?:\[%([^%\]\[]*)%\])|[^"]|"[^"]*")*?(?://)

所以我在的問題是,這種不匹配這不//
事實上結束y方向的弦,它聚合線,直到它可以在一個包含//
我試圖在最後與?.*?$來解決這個問題,以表示//是沒有必要的,並得出結論去第一個endline,但它並沒有真正的工作。

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

我使用C#和Regex.MatchesRegexOptions.Multiline選項,這是我逃脫字符串

"^(?:(?:\\[%([^%\\]\\[]*)%\\])|[^\"]|\"[^\"]*\")*?(?://)" 
+1

你寫與正則表達式編譯器? – manojlds 2011-06-06 23:10:57

+0

我正在驗證用戶提供的腳本,然後將它發送到計算引擎[:(]。我必須確保每個標記都與現有變量匹配,所以這是我提取它們的方式。只需使用循環和子串。 – 2011-06-06 23:12:54

回答

1

我覺得這樣做是一回事有點困難,因爲雙引號匹配難以檢查。你可以這樣做在兩個階段:

¤刪除所有匹配的雙引號
¤找到你的模式

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, "")); 
2

首先,讓我只是說我喜歡正規表達式。我讀了Friedl's Mastering Regular Expressions年前,並從未回頭。這就是說,做不是使用一個巨大的正則表達式來解決這個問題。使用你的編程語言。你最終會得到更可讀和可維護的代碼。看起來你正試圖解析一個語言,在這裏不同的規則適用於不同的語境。您的模式可能會出現在帶引號的字符串中。引用的字符串可能在裏面有需要轉義的引號。捕獲一個正則表達式中的所有細節將是一場噩夢。我建議通過字符逐個字符遍歷,沿途創建令牌,查找引號,並跟蹤您是否在引用字符串中。當你遇到符合條件的標記時(你可以使用這個部分的正則表達式),並且你不在一個字符串中,把它添加到你的列表中。當您敲擊聲明的結尾並遇到評論的開頭時,請丟棄剩餘的字符,直到評論結束。