0

こんにちは皆さん、私は正規表現が初めてで、html ウェブページの img タグから srcs 値を取得しようとしているので、この正規表現を作成しました。@"<img.*src *=*([\x22\x27])(?<path>.+)(\1).*/>"
しかし、グループ「パス」から値を取得しようとするとこのサンプル タグを使用すると、次の
<img src='kkkkkk' class='icon' alt='' />
ようになりkkkkkk' class='icon' alt='ますkkkkkk。私はそれを理解することはできません。
データを抽出して印刷するために使用しているコードは次のとおりです。

Regex SrcRegex = new Regex(@"<img.*src *=*([\x22\x27])(?<path>.+)(\1).*/>", RegexOptions.IgnoreCase);

string TestTag = "<img src='kkkkkk' class='icon' alt='' />";

MatchCollection MatchedString = SrcRegex.Matches(ReadIn);

foreach (Match M in MatchedString)
        Console.WriteLine(M.Groups["path"].Value);

注意してくれてありがとう、そして私の英語で失礼します。

4

2 に答える 2

1

正規表現の用語で答えると、問題は単に で貪欲な量指定子を使用しているため、意図したとおり、の引用ではなく最後の(?<path>.+)引用に一致することです。非貪欲にするだけです:

Regex SrcRegex = new Regex(@"<img.*src *= *([\x22\x27])(?<path>.+?)(\1).*/>", RegexOptions.IgnoreCase);

ところで、=の後にスペースを追加しました。それはあなたが意図したものだと思うからです。=を要求し、必要に応じてその後のスペースを一致させたいと思いますよね? あなたが持っていた方法は、 =と開始引用符の間にスペースを入れずに、0 個以上の=記号に一致します。

于 2013-07-29T20:50:25.117 に答える
1

html を扱う場合は、正規表現ではなく html パーサーを使用することをお勧めします。たとえば、HtmlAgilityPackの使用

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(htmlstring);

var imgUrls = doc.DocumentNode.Descendants("img")
                .Select(img => img.Attributes["src"].Value)
                .ToList();
于 2013-07-29T20:43:10.903 に答える