Regex .NET Попытка захватить группу с повторением просмотра вперед

Обратите внимание, что здесь я использую механизм регулярных выражений .NET

Вот строка синтаксического анализа:

    <div class="c411Listing" onmouseover="ResidentialListings.enhanceListing(this, 1);" onmouseout="ResidentialListings.degradeListing(this, 1);">

    <div id="Contact1" class="listingDetail">

        <span id="ContactName1" class="c411ListedName"><a href="/res/5068300124/P-DESCHESNES/184421926.html" onclick="utagsave();" onmousedown="utag.link({link_name:'person_name', link_attr1:'in_listing'})" title="P DESCHESNES  on 85 Red Pine Dr">P DESCHESNES</a></span>

        <span class="c411Phone" id="ContactPhone1">(506) 830-2224</span>

        <span class="c411ListingGeo"><span class="adr" id="ContactAddress1">85 Fictive Dr NB</span></span>


        <a class="c411GetDirections c411NoPrint" id="ContactDirections1" href="/map/mapSearch.html?layers=dir&amp;from=85+Red+Pine+Dr+NB&amp;what=P+Deschesnes&amp;where=Canada" onmousedown="utag.link({link_name:'direction', link_attr1:'in_listing'});" rel="nofollow">Get directions&nbsp;<span>&rarr;</span></a>


    </div>
    <div class="c411HoverMarker c411NoPrint" style="display:none;">
        <a href="/res/5068300124/P-DESCHESNES/184421926.html" title="P DESCHESNES"><span>&nbsp;</span></a>
    </div>
</div>




<div class="c411Listing" onmouseover="ResidentialListings.enhanceListing(this, 2, 0);" onmouseout="ResidentialListings.degradeListing(this, 2, 0);">

    <div id="Contact2" class="listingDetail">

        <span id="ContactName2" class="c411ListedName"><a href="/res/4189883202/P-Deschesnes/179906536.html" onclick="utagsave();" onmousedown="utag.link({link_name:'person_name', link_attr1:'in_listing'})" title="P Deschesnes  on 6585 Rue des Orchid&eacute;es">P Deschesnes</a></span>

        <span class="c411Phone" id="ContactPhone2">(418) 987-3202</span>

        <span class="c411ListingGeo"><span class="adr" id="ContactAddress2">1000 Rue des Fictive QC G1X 3Z5</span></span>


        <a class="c411GetDirections c411NoPrint" id="ContactDirections2" href="/map/mapSearch.html?layers=dir&amp;from=1000+Rue+des+Orchid%C3%A9esFictive+QC+G1X+3Z5&amp;what=P+Deschesnes&amp;where=Canada" onmousedown="utag.link({link_name:'direction', link_attr1:'in_listing'});" rel="nofollow">Get directions&nbsp;<span>&rarr;</span></a>


    </div>
    <div class="c411HoverMarker c411NoPrint" style="display:none;">
        <a href="/res/4189883202/P-Deschesnes/179906536.html" title="P Deschesnes"><span>&nbsp;</span></a>
    </div>
</div>




<div class="c411Listing" onmouseover="ResidentialListings.enhanceListing(this, 3, 0);" onmouseout="ResidentialListings.degradeListing(this, 3, 0);">

    <div id="Contact3" class="listingDetail">

        <span id="ContactName3" class="c411ListedName"><a href="/res/4506702257/P-DESCHESNES/181606171.html" onclick="utagsave();" onmousedown="utag.link({link_name:'person_name', link_attr1:'in_listing'})" title="P DESCHESNES  on 1736 Rue Saint-Alexandre">P DESCHESNES</a></span>

        <span class="c411Phone" id="ContactPhone3">(450) 671-1111</span>

        <span class="c411ListingGeo"><span class="adr" id="ContactAddress3">1736 Rue Fictive Longueuil QC J1J 1T2</span></span>


        <a class="c411GetDirections c411NoPrint" id="ContactDirections3" href="/map/mapSearch.html?layers=dir&amp;from=1000+Rue+Saint-Fictive+Longueuil+QC+J1J+1T1&amp;what=P+Deschesnes&amp;where=Canada" onmousedown="utag.link({link_name:'direction', link_attr1:'in_listing'});" rel="nofollow">Get directions&nbsp;<span>&rarr;</span></a>


    </div>
    <div class="c411HoverMarker c411NoPrint" style="display:none;">
        <a href="/res/4506702257/P-DESCHESNES/181606171.html" title="P DESCHESNES"><span>&nbsp;</span></a>
    </div>
</div>

Здесь вы можете увидеть повторяющийся узор. Я хотел бы получить соответствие для каждого контакта (1,2,3) с 3 группами внутри: ContactName, Phone и адрес.

В этом примере я должен получить 3 совпадения, каждое из которых содержит имя, телефон и адрес, но по некоторым причинам я получаю только последний телефон и адрес.

Вот мое регулярное выражение .NET:

(?si)(?(?=.*<div id="Contact[\d{1,2}]").*<span id="ContactName[\d{1,2}]\".*title=.*>(.*)</a>.*id="ContactPhone[\d{1,2}]">(.*)</span>.*id="ContactAddress[\d{1,2}]\">(.*)</span>)

Подскажите, пожалуйста, что я делаю не так?


person Pilouk    schedule 08.12.2013    source источник


Ответы (1)


Для очень простых фрагментов HTML могут быть полезны регулярные выражения. Для чего-то более обширного, как ваш пример, анализатор HTML, такой как Html Agility Pack, вероятно, будет самым надежным решение.

Есть причины не пытаться анализировать HTML с помощью регулярных выражений: Использование регулярных выражений для анализа HTML: почему бы и нет?.

person Andrew Morton    schedule 08.12.2013
comment
Я понимаю это, и я буду искать его дальше, но не могли бы вы помочь мне найти решение выше с помощью reg ex и примера. Это поможет мне понять .net reg ex в этом случае - person Pilouk; 09.12.2013
comment
возможно, что вам нужно использовать не жадный модификатор для ваших .*s: .*?. - person Andrew Morton; 11.12.2013