2011-01-16 18 views
0

タグ名に基づいてhtmlタグ(タグ全体)と一致させる必要があります。私はこれを持っているスクリプトタグの場合正規表現で特定のhtmlタグを一致させる

<script.+src=.+(\.js|\.axd).+(</script>|>) 

それは正しく、次のHTMLで両方のタグに一致します。しかし

<script src="Scripts/JScript1.js" type="text/javascript" /> 
<script type="text/javascript" src="Scripts/JScript2.js" /> 

、私は次のようにリンクタグを行うとき:

<link.+href=.+(\.css).+(</link>|>) 

これはすべてを一度に一致させます(例えば、両方のアイテムを含む1つの試合を返します):

<link href="Stylesheets/StyleSheet1.css" rel="Stylesheet" type="text/css" /> 
<link href="Stylesheets/StyleSheet2.css" rel="Stylesheet" type="text/css" /> 

私はここで何が欠けていますか?正規表現は、一致するテキスト以外は本質的に同じですか?

また、正規表現はHTML解析のための優れたツールではないことを知っています...私はおそらく最後にHtmlAgilityPackを使用することになりますが、これはナッツを駆動しています。健康!

+0

これがあなたを運転しているのであれば、まだHTMLアジリティパックを使用していないのはなぜですか? – BoltClock

+0

私はそれを今すぐダウンロードしています...私はちょうどそれらが一致しない理由を理解できません! –

+0

あなたのREは '.'の過度使用のためあいまいです。Pythonでは、両方のREが入力全体と一致します。 –

答えて

2

。+ワイルドカードはすべて一致します。この:

<link.+href=.+(\.css).+(</link>|>) 

の可能性が高い。このように一致します。

<link  => <link 
.+   => href="Stylesheets/StyleSheet1.css" rel="Stylesheet" type="text/css" /> 
       <link 
href=  => href= 
.+  => "Stylesheets/StyleSheet2 
\.css  => .css 
.+  => " rel="Stylesheet" type="text/css"/
</link>|> => > 

は、代わりに[^>] +の代わりに使用することを検討してください+。。また、終了タグについて本当に気にしていますか?

<link[^>]+href=[^>]+(\.css)[^>]+> 
+0

+1良い説明と、負の文字クラス '[^>] +アプローチを指摘してください。 –

+0

'>'は属性値に使用できます。 – Gumbo

+0

'>'は属性で許可されており、これはこの解決法を破ります。これはリンクタグにとってはほとんど問題ではありません。これは、これが正規表現では簡単には解決できないため、幸いです。 HtmlAgilityPackを使用するOPのソリューションは、最終的には正しいものです。 – Chris

1

あなたの正規表現は貪欲です。 .+と一致するたびに、これは貪欲です。 ?を追加することで貪欲でないようにする必要があります。これにより、パターンを満たすために限られた文字数に一致し、次の一致する文字列には達しません。

変更これまでのパターン:"<link.+?href=.+?(\.css).+?(</link>|>)"

次にあなたがそれらの上に複数の一致とループを取得するためにRegex.Matchesを使用する必要があります。

関連する問題