2011-11-12 10 views
1

正規表現を使用してASPXファイル内の属性値を検索する必要があります。ASPX属性正規表現での解析#

つまり、不正な形式のHTMLやHTML関連の問題を心配する必要はありません。

特定の属性(LocText)の値を見つける必要があります。私は引用符の中にあるものを入手したい。この属性は、それゆえの一部として考えられているため、このような値の内部<% =、<%番号、<%の$などなど どれASPXタグには意味がありません。

私はこのようなルックスで始まった正規表現:

LocText="([^"]+)" 

これは素晴らしい作品、結果テキストで最初のグループは、(& QUOTが許可されていない二重引用符、以外のすべてを取得します。 2番目の正規表現は、その後適用されなければならない -

しかし、ASPXファイルには、単一引用符を使用できます)の代わりに使用する必要があります。

LocText='([^']+)' 

私は、これらの2つの正規表現を使用することができますが、私はそれらを接続する方法を探しています。

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

これも機能しますが、不要な数のグループが作成されるため効率的ではありません。私は、これは何らかの形でバックリファレンスを使って行うことができると思うが、それを動作させることはできない。

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

私はこれで、私は最初のグループに単一/二重引用符を保存し、その後、私は最初のグループで見つかった文字ではありません何かを読むためにそれを伝えることを考えました。これは最初のグループからの引用によって再び囲まれています。明らかに、私は間違っているし、それはそのように動作していない。

は、どのような方法は、一つのグループは、私が取得したい属性の値であるとグループのちょうど最小量を作成する最初の2つの式を一緒に接続する方法、ありますか?それは、単一/二重引用符値のための後方参照を使用して、または私は完全にそれらの意味を誤解していることは可能ですか?

答えて

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

関連する問題