2011-11-12 42 views
1

我需要使用正則表達式在ASPX文件中查找屬性值。C#中的ASPX屬性正則表達式解析#

這意味着您無需擔心格式錯誤的HTML或任何與HTML相關的問題。

我需要找到一個特定屬性(LocText)的值。我想知道引號內的內容。 任何ASPX標記,例如<%=,<%#,<%$等等,這個值對於這個屬性沒有意義,因此被認爲是它的一部分。

我開始看起來像這樣的正則表達式:

LocText="([^"]+)" 

這個偉大的工程,第一組,這是結果的文本,得到的一切,除了雙引號,這是不允許有(& QUOT;必須改用)

但是,ASPX文件允許使用單引號 - 第二個正則表達式必須應用於此。

LocText='([^']+)' 

我可以使用這兩個正則表達式,但我正在尋找一種方法來連接它們。

LocText=("([^"]+)"|'([^']+)') 

這也適用,但似乎不是非常有效,因爲它創建不必要的組數。我認爲這可以通過使用反向引用以某種方式完成,但我無法實現它的工作。

LocText=(["']{1})([^\1]+)\1 

我覺得這個,我的單/雙引號保存到第一組,然後我告訴它讀取任何不是第一組中發現的字符。這再次被第一組的報價所包含。很明顯,我錯了,它不是那樣工作的。

有沒有什麼辦法,如何將前兩個表達式連接在一起,只創建一個組的最小數量,其中一個組是我想要獲得的屬性的值?是否可以使用單引號值的反向引用,還是我完全誤解了它們的含義?

回答

2

我說有交替您的解決方案並不壞,但你可以使用named captures所以結果總是在同一組中的價值發現:

Regex regexObj = new Regex(@"LocText=(?:""(?<attr>[^""]+)""|'(?<attr>[^']+)')"); 
resultString = regexObj.Match(subjectString).Groups["attr"].Value; 

說明:

LocText=   # Match LocText= 
(?:    # Either match 
"(?<attr>[^"]+)" # "...", capture in named group <attr> 
|     # or match 
'(?<attr>[^']+)' # '...', also capture in named group <attr> 
)     # End of alternation 

另一種選擇是使用lookahead assertions[^\1]不工作,因爲您不能在字符類中放置反向引用,但可以在周圍使用它們) :

Regex regexObj = new Regex(@"LocText=([""'])((?:(?!\1).)*)\1"); 
resultString = regexObj.Match(subjectString).Groups[2].Value; 

說明:

LocText= # Match LocText= 
(["'])  # Match and capture (group 1) " or ' 
(   # Match and capture (group 2)... 
(?:  # Try to match... 
    (?!\1) # (unless it's the quote character we matched before) 
    .  # any character 
)*  # repeat any number of times 
)   # End of capturing group 2 
\1   # Match the previous quote character 
+0

工作和漂亮的解決方案,萬分感謝:) – Mirek