0

div の ID を抽出したい HTML ファイル (HTML AgilityPack は使用できません) があります (ある場合)。

<div id="div1">Street ___________________ </div>
<div id="div2">CAP |__|__|__|__|__| number ______ </div>
<div id="div3">City _____________________ State |__|__|</div>
<div id="div4">City2 ____________________ State2 _____</div>

アンダースコア__を抽出するパターンがあります。 [\ _]{3,}

アンダースコアの前に div がある場合は、それを抽出します。そうでない場合は、アンダースコアのみを取得します。

私はこれまでこのパターンを構築してきました(<div id(.+?)>(\w)([\ _]{3,}/*))([\ _]{3,})

最初の部分は 3 つのグループから構築されます。1 - div タグ、2 - ラベル、3 - アンダースコア

1 - <div id(.+?)>、2 - (\w)、3 -[\ _]{3,}/*

ID div2 の div は、英数字以外の文字が含まれているため、ID を取得しません。

Q:私のパターンの何が問題なのですか?

4 つの div に必要な一致:

<div id="div1">Street ___________________
______ 
<div id="div3">City _____________________
<div id="div4">City2 ____________________
_____
4

2 に答える 2

1
  • \wは 1 文字だけです。おそらく 1 つまたは複数の - を言いたいと思うでしょう\w+

  • /*- 0 個以上/の ? それがどこに当てはまるのかわかりません。

  • 1 つ以上の not >(つまり[^>]+) は、おそらく よりも優れたアイデアです.+?.+?最初の で停止しようとし>ますが、一致する文字列が見つかるまで続行します。つまり:

    <div id=1>this is not valid</div><div id=2>this is valid___</div>
    

    from だけでなく、文字列全体に一致し<div id=2>ます。

  • あなたの質問からわかる限り、アンダースコアの前はすべてオプションです。

パターン:

(?:(<div id[^>]+>)(\w+))?([\ _]{3,})

C# テスト.

于 2013-08-07T09:48:13.153 に答える
1

次のようなものを試してください

string html = @"<div id=""div1"">Street ___________________ </div>
<div id=""div2"">CAP |__|__|__|__|__| number ______ </div>
<div id=""div3"">City _____________________ State |__|__|</div>
<div name=""hello"" id=""div4"">City _____________________ State |__|__|</div>
<div name=""house"">City _____________________ State |__|__|</div>
<div id=""notext""></div>";

var rx = new Regex(@"<div(?:(?: id=""(?<id>[^""]+)"")|[^>])*>(?<content>[^<]*)</div>", 
                   RegexOptions.IgnoreCase);

var matches = rx.Matches(html);

foreach (Match match in matches)
{
    var id = match.Groups["id"];
    var content = match.Groups["content"];

    Console.WriteLine("id present: {0}, id: {1}, text: {2}", 
                      id.Success, 
                      id.ToString(), 
                      content.ToString());
}

それが機能する場合は、正規表現を説明します(つまり<div(?:(?: id="(?<id>[^"]+)")|[^>])*>(?<content>[^<]*)</div>

于 2013-08-07T09:51:02.883 に答える