2011-06-15 173 views
9

我正在爲ColdFusion代碼編寫解析器。我正在使用正則表達式(在C#中)來提取cfquery標記的名稱datasource屬性。用於匹配引號和單引號的正則表達式

暫時的正則表達式如下 <cfquery\s.*datasource\s*=\s*(?:'|")(.*)(?:'|")

它非常適用於像 <cfquery datasource="myDS"<cfquery datasource='myDS'

串但解析字符串時,像 <cfquery datasource="#GetSourceName('myDS')#"

顯然它變得瘋狂正則表達式的一部分(?:'|「)是原因。是否有一種方法在th時只匹配單引號第一場比賽是單引號?只有在第一場比賽是雙引號時才匹配雙引號?

在此先感謝!

回答

6

編輯:我覺得這應該在C#中工作,你只需要做一回參考:一回參考首場比賽\1

datasource\s*=\s*('|")(.*)(?:\1) 

或許

datasource\s*=\s*('|")(.*)(?:$1) 

比賽datasource="#GetSourceName('myDS')#"

當然,你不能忽略第一個捕獲組?:,仍然有這項工作。此外,您可能需要設置lazy標誌,以便不與其他"

1

如果可能的話,我會建議使用兩個不同的正則表達式,或者以不同的方式分割正則表達式。

對於單個正則表達式,考慮@Mike發佈的問題, ("[^"]*")|('[^']*') 然後您可以解析出引號。

這樣做的另一種可能的方法是使用前瞻/後視,但這往往會變得混亂,並沒有得到普遍支持。

+0

在我看來,你的表情在錯誤的地方有第二個*,應該是(「[^」] *「)|('[^'] *')...除非你的意圖是匹配許多單個字符常量如'x''y''z'。 – 2014-12-27 20:01:51

+1

我認爲你是對的。修正。這也不能處理逃脫的單引號或雙引號,但問題和答案是如此古老,以至於我會讓它不完整(儘管現在正確)。 – 2015-01-20 23:54:22

相關問題