1

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

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

特定の属性 (LocText) の値を見つける必要があります。引用符の中にあるものを取得したい。値内の <%=、<%#、<%$ などの ASPX タグは、この属性には意味がないため、その一部と見なされます。

私が始めた正規表現は次のようになります。

LocText="([^"]+)"

これはうまく機能し、結果テキストである最初のグループは、そこで許可されていない二重引用符を除くすべてを取得します (代わりに " ; を使用する必要があります)

ただし、ASPX ファイルでは一重引用符を使用できます。その場合、2 番目の正規表現を適用する必要があります。

LocText='([^']+)'

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

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

これも機能しますが、不要な数のグループを作成しているため、あまり効率的ではないようです。これは、後方参照を使用して何らかの方法で実行できると思いますが、機能させることができません。

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

これにより、一重/二重引用符を最初のグループに保存し、最初のグループで見つかった文字ではないものを読み取るように指示したと思いました。これは、最初のグループからの引用によって再び囲まれています。明らかに、私は間違っており、そのようには機能していません。

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

4

1 に答える 1

2

交互のソリューションはそれほど悪くはないと思いますが、名前付きキャプチャを使用して、結果が常に同じグループの値で見つかるようにすることができます。

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

別のオプションは、先読みアサーションを使用することです([^\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
于 2011-11-12T10:57:32.487 に答える