/ / Nieoczekiwanie pusta wartość grupy dopasowania - regex, vb.net

Nieoczekiwanie pusta wartość grupy dopasowania - regex, vb.net

Korzystam z wyrażenia regularnego, aby pobrać zawartość strony internetowej. Stosuję podobne podejście do innego stołu i to działa dobrze; ale mam z tym problem

.Giocatore_ammonito = Regex.Match(Content, "<td class=""player large-link""s*>(.+?)</td>").Groups(1).ToString

gdzie Content pochodzi z http://it.soccerway.com/a/block_competition_playerstats?block_id=page_competition_1_block_competition_playerstats_9&callback_params=%7B%22round_id%22%3A%2227139%22%2C%22view%22%3A%222%22%7D&action=changeView¶ms=%7B%22view%22%3A2%7D.

Groups(1).ToString zwraca pusty wynik, ale nie rozumiem dlaczego.

Co jest złego w wyrażeniu regularnym, którego mi brakuje?

Dla kompletności, oto jest Content„wartość inline:

{"commands":[{"name":"updateContainer","parameters":{"content":"<div class="container-full"><div class="block  clearfix block_competition_playerstats_diciplinary-wrapper" id="page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1-wrapper"><div class="content  "><div id="page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1_pagination" class="pagination match-pagination clearfix"><div class="nav_description"><a rel="previous" class="previous disabled" id="page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1_previous">&laquo; precedente</a><a rel="next" class="next " id="page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1_next">successiva &raquo;</a></div></div><div class="block_competition_playerstats_diciplinary real-content clearfix " id="page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1"><table class="playerstats table" id="page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1_table" data-round_id="27139" data-season_id="0"><thead><tr class="sub-head"><th class="player">Giocatore</th><th class="team">Squadra</th><th class="number yellow-cards"><img src="http://s1.swimg.net/gsmf/520/img/events/YC.png" width="13" height="13" alt="Cartellino giallo" title="Cartellino giallo" /></th><th class="number red-cards"><img src="http://s1.swimg.net/gsmf/520/img/events/RC.png" width="13" height="13" alt="Cartellino rosso" title="Cartellino rosso" /></th><th class="number points"><acronym title="Punti">Pts</acronym></th></tr></thead><tbody><tr class="odd" data-people_id="416"><td class="player large-link"><a href="/players/rafael-marquez-alvarez/416/" class="flag_16 left_16 mexico_16_left">R. Mu00e1rquez</a></td><td class="team large-link"><a href="/teams/italy/hellas-verona-fc/1277/" title="Hellas Verona">Verona</a></td><td class="number yellow-cards">5</td><td class="number red-cards">2</td><td class="number points">11</td></tr><tr class="even" data-people_id="13870"><td class="player large-link"><a href="/players/facundo-sebastian-roncaglia/13870/" class="flag_16 left_16 argentina_16_left">F. Roncaglia</a></td><td class="team large-link"><a href="/teams/italy/genoa-cfc/1276/" title="Genoa">Genoa</a></td><td class="number yellow-cards">5</td><td class="number red-cards">2</td><td class="number points">11</td></tr><tr class="odd" data-people_id="148164"><td class="player large-link"><a href="/players/afriyie-acquah/148164/" class="flag_16 left_16 ghana_16_left">A. Acquah</a></td><td class="team large-link"><a href="/teams/italy/parma-fc/1243/" title="Parma">Parma</a></td><td class="number yellow-cards">7</td><td class="number red-cards">1</td><td class="number points">10</td></tr><tr class="even" data-people_id="3991"><td class="player large-link"><a href="/players/daniele-bonera/3991/" class="flag_16 left_16 italy_16_left">D. Bonera</a></td><td class="team large-link"><a href="/teams/italy/ac-milan/1240/" title="Milan">Milan</a></td><td class="number yellow-cards">3</td><td class="number red-cards">2</td><td class="number points">9</td></tr><tr class="odd" data-people_id="18275"><td class="player large-link"><a href="/players/federico-peluso/18275/" class="flag_16 left_16 italy_16_left">F. Peluso</a></td><td class="team large-link"><a href="/teams/italy/us-sassuolo-calcio/5681/" title="Sassuolo">Sassuolo</a></td><td class="number yellow-cards">6</td><td class="number red-cards">1</td><td class="number points">9</td></tr><tr class="even" data-people_id="4473"><td class="player large-link"><a href="/players/dal-belo-dias-da-silva/4473/" class="flag_16 left_16 brazil_16_left">Felipe</a></td><td class="team large-link"><a href="/teams/italy/parma-fc/1243/" title="Parma">Parma</a></td><td class="number yellow-cards">2</td><td class="number red-cards">2</td><td class="number points">8</td></tr><tr class="odd" data-people_id="178336"><td class="player large-link"><a href="/players/stefano-sturaro/178336/" class="flag_16 left_16 italy_16_left">S. Sturaro</a></td><td class="team large-link"><a href="/teams/italy/genoa-cfc/1276/" title="Genoa">Genoa</a></td><td class="number yellow-cards">5</td><td class="number red-cards">1</td><td class="number points">8</td></tr><tr class="even" data-people_id="4295"><td class="player large-link"><a href="/players/luca-cigarini/4295/" class="flag_16 left_16 italy_16_left">L. Cigarini</a></td><td class="team large-link"><a href="/teams/italy/atalanta-bergamo/1255/" title="Atalanta">Atalanta</a></td><td class="number yellow-cards">5</td><td class="number red-cards">1</td><td class="number points">8</td></tr><tr class="odd" data-people_id="246415"><td class="player large-link"><a href="/players/domenico-berardi/246415/" class="flag_16 left_16 italy_16_left">D. Berardi</a></td><td class="team large-link"><a href="/teams/italy/us-sassuolo-calcio/5681/" title="Sassuolo">Sassuolo</a></td><td class="number yellow-cards">5</td><td class="number red-cards">1</td><td class="number points">8</td></tr><tr class="even" data-people_id="2006"><td class="player large-link"><a href="/players/nigel-de-jong/2006/" class="flag_16 left_16 netherlands_16_left">N. de Jong</a></td><td class="team large-link"><a href="/teams/italy/ac-milan/1240/" title="Milan">Milan</a></td><td class="number yellow-cards">8</td><td class="number red-cards">0</td><td class="number points">8</td></tr><tr class="odd" data-people_id="17855"><td class="player large-link"><a href="/players/simone-padoin/17855/" class="flag_16 left_16 italy_16_left">S. Padoin</a></td><td class="team large-link"><a href="/teams/italy/juventus-fc/1242/" title="Juventus">Juventus</a></td><td class="number yellow-cards">1</td><td class="number red-cards">2</td><td class="number points">7</td></tr><tr class="even" data-people_id="61429"><td class="player large-link"><a href="/players/ivan-radovanovic/61429/" class="flag_16 left_16 serbia_16_left">I. Radovanoviu0107</a></td><td class="team large-link"><a href="/teams/italy/ac-chievo-verona/1248/" title="Chievo Verona">Chievo</a></td><td class="number yellow-cards">4</td><td class="number red-cards">1</td><td class="number points">7</td></tr><tr class="odd" data-people_id="71325"><td class="player large-link"><a href="/players/segundo-victor-ibarbo-guerrero/71325/" class="flag_16 left_16 colombia_16_left">V. Ibarbo</a></td><td class="team large-link"><a href="/teams/italy/cagliari-calcio/1256/" title="Cagliari">Cagliari</a></td><td class="number yellow-cards">4</td><td class="number red-cards">1</td><td class="number points">7</td></tr><tr class="even" data-people_id="71"><td class="player large-link"><a href="/players/daniele-de-rossi/71/" class="flag_16 left_16 italy_16_left">D. De Rossi</a></td><td class="team large-link"><a href="/teams/italy/as-roma/1241/" title="Roma">Roma</a></td><td class="number yellow-cards">4</td><td class="number red-cards">1</td><td class="number points">7</td></tr><tr class="odd" data-people_id="139596"><td class="player large-link"><a href="/players/kalidou-koulibaly/139596/" class="flag_16 left_16 france_16_left">K. Koulibaly</a></td><td class="team large-link"><a href="/teams/italy/ssc-napoli/1270/" title="Napoli">Napoli</a></td><td class="number yellow-cards">4</td><td class="number red-cards">1</td><td class="number points">7</td></tr></tbody><tfoot><tr><td colspan="5">abbiamo assegnato punti per ciascun cartellino giallo (1 punto) e rosso (3 punti). Da notare che non rappresentano alcuna classifica ufficiale.</td></tr></tfoot></table><script type="text/javascript" charset="utf-8">(function(){var table = $("page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1_table");Popupizer.setup(table.select("tbody td[class*="yellow-cards"]"), "player_events", { column: "yellow_cards" });Popupizer.setup(table.select("tbody td[class*="red-cards"]"), "player_events", { column: "red_cards" });new PopupManager(table);})();n</script></div></div>n</div>n<script type="text/javascript" charset="utf-8">(function() {var block = new PaginatedBlock("page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1", "block_competition_playerstats_diciplinary", {"page":0,"per_page":15,"round_id":27139,"season_id":0});block.registerForCallbacks();block.setAttribute("has_previous_page", false);block.setAttribute("has_next_page", true);TimestampFormatter.format("page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1");})();n</script></div>n"}},{"name":"updateCallbackParams","parameters":{"params":{"round_id":"27139","view":"2"}}}],"timestamp":"Sun, 04 Jan 2015 20:52:10 +0100"}

Odpowiedzi:

0 dla odpowiedzi № 1

Przegląd

Idąc dalej w kierunku, w którym @Rawing zaczął podążać za swoim komentarzem, występują problemy z odwrotnym ukośnikiem w treści, za którą musi wziąć pod uwagę wyrażenie regularne.

Spróbuj zamiast tego ...

.Giocatore_ammonito = Regex.Match(Content, "<td class=\""player large-link\""s*>(.+?)<\/td>").Groups(1).ToString
"                                                     ^^                   ^^            ^^

... aby uwzględnić odwrotne ukośniki poprzedzające podwójne cudzysłowy wokół class atrybuty ” i odwrotne ukośniki poprzedzające ukośniki w td zamykające tagi.

Również, możesz chcieć wyszoruj uciekający ukośnik, który w przeciwnym razie pozostanie w wartościach grup dopasowania.

Kod demonstracyjny

Oto kod VB.NET, który pokazuje 1) jak zaktualizowane wyrażenie regularne działa z twoimi treściami i 2) jak opcjonalnie wyszorować przeciągający się ukośnik odwrotny od wartości grupy dopasowania:

" NOTE: content returned from the URL provided in the question
Dim Content As String = "{""commands"":[{""name"":""updateContainer"",""parameters"":{""content"":""<div class=""container-full""><div class=""block  clearfix block_competition_playerstats_diciplinary-wrapper"" id=""page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1-wrapper""><div class=""content  ""><div id=""page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1_pagination"" class=""pagination match-pagination clearfix""><div class=""nav_description""><a rel=""previous"" class=""previous disabled"" id=""page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1_previous"">&laquo; precedente</a><a rel=""next"" class=""next "" id=""page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1_next"">successiva &raquo;</a></div></div><div class=""block_competition_playerstats_diciplinary real-content clearfix "" id=""page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1""><table class=""playerstats table"" id=""page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1_table"" data-round_id=""27139"" data-season_id=""0""><thead><tr class=""sub-head""><th class=""player"">Giocatore</th><th class=""team"">Squadra</th><th class=""number yellow-cards""><img src=""http://s1.swimg.net/gsmf/520/img/events/YC.png"" width=""13"" height=""13"" alt=""Cartellino giallo"" title=""Cartellino giallo"" /></th><th class=""number red-cards""><img src=""http://s1.swimg.net/gsmf/520/img/events/RC.png"" width=""13"" height=""13"" alt=""Cartellino rosso"" title=""Cartellino rosso"" /></th><th class=""number points""><acronym title=""Punti"">Pts</acronym></th></tr></thead><tbody><tr class=""odd"" data-people_id=""416""><td class=""player large-link""><a href=""/players/rafael-marquez-alvarez/416/"" class=""flag_16 left_16 mexico_16_left"">R. Mu00e1rquez</a></td><td class=""team large-link""><a href=""/teams/italy/hellas-verona-fc/1277/"" title=""Hellas Verona"">Verona</a></td><td class=""number yellow-cards"">5</td><td class=""number red-cards"">2</td><td class=""number points"">11</td></tr><tr class=""even"" data-people_id=""13870""><td class=""player large-link""><a href=""/players/facundo-sebastian-roncaglia/13870/"" class=""flag_16 left_16 argentina_16_left"">F. Roncaglia</a></td><td class=""team large-link""><a href=""/teams/italy/genoa-cfc/1276/"" title=""Genoa"">Genoa</a></td><td class=""number yellow-cards"">5</td><td class=""number red-cards"">2</td><td class=""number points"">11</td></tr><tr class=""odd"" data-people_id=""148164""><td class=""player large-link""><a href=""/players/afriyie-acquah/148164/"" class=""flag_16 left_16 ghana_16_left"">A. Acquah</a></td><td class=""team large-link""><a href=""/teams/italy/parma-fc/1243/"" title=""Parma"">Parma</a></td><td class=""number yellow-cards"">7</td><td class=""number red-cards"">1</td><td class=""number points"">10</td></tr><tr class=""even"" data-people_id=""3991""><td class=""player large-link""><a href=""/players/daniele-bonera/3991/"" class=""flag_16 left_16 italy_16_left"">D. Bonera</a></td><td class=""team large-link""><a href=""/teams/italy/ac-milan/1240/"" title=""Milan"">Milan</a></td><td class=""number yellow-cards"">3</td><td class=""number red-cards"">2</td><td class=""number points"">9</td></tr><tr class=""odd"" data-people_id=""18275""><td class=""player large-link""><a href=""/players/federico-peluso/18275/"" class=""flag_16 left_16 italy_16_left"">F. Peluso</a></td><td class=""team large-link""><a href=""/teams/italy/us-sassuolo-calcio/5681/"" title=""Sassuolo"">Sassuolo</a></td><td class=""number yellow-cards"">6</td><td class=""number red-cards"">1</td><td class=""number points"">9</td></tr><tr class=""even"" data-people_id=""4473""><td class=""player large-link""><a href=""/players/dal-belo-dias-da-silva/4473/"" class=""flag_16 left_16 brazil_16_left"">Felipe</a></td><td class=""team large-link""><a href=""/teams/italy/parma-fc/1243/"" title=""Parma"">Parma</a></td><td class=""number yellow-cards"">2</td><td class=""number red-cards"">2</td><td class=""number points"">8</td></tr><tr class=""odd"" data-people_id=""178336""><td class=""player large-link""><a href=""/players/stefano-sturaro/178336/"" class=""flag_16 left_16 italy_16_left"">S. Sturaro</a></td><td class=""team large-link""><a href=""/teams/italy/genoa-cfc/1276/"" title=""Genoa"">Genoa</a></td><td class=""number yellow-cards"">5</td><td class=""number red-cards"">1</td><td class=""number points"">8</td></tr><tr class=""even"" data-people_id=""4295""><td class=""player large-link""><a href=""/players/luca-cigarini/4295/"" class=""flag_16 left_16 italy_16_left"">L. Cigarini</a></td><td class=""team large-link""><a href=""/teams/italy/atalanta-bergamo/1255/"" title=""Atalanta"">Atalanta</a></td><td class=""number yellow-cards"">5</td><td class=""number red-cards"">1</td><td class=""number points"">8</td></tr><tr class=""odd"" data-people_id=""246415""><td class=""player large-link""><a href=""/players/domenico-berardi/246415/"" class=""flag_16 left_16 italy_16_left"">D. Berardi</a></td><td class=""team large-link""><a href=""/teams/italy/us-sassuolo-calcio/5681/"" title=""Sassuolo"">Sassuolo</a></td><td class=""number yellow-cards"">5</td><td class=""number red-cards"">1</td><td class=""number points"">8</td></tr><tr class=""even"" data-people_id=""2006""><td class=""player large-link""><a href=""/players/nigel-de-jong/2006/"" class=""flag_16 left_16 netherlands_16_left"">N. de Jong</a></td><td class=""team large-link""><a href=""/teams/italy/ac-milan/1240/"" title=""Milan"">Milan</a></td><td class=""number yellow-cards"">8</td><td class=""number red-cards"">0</td><td class=""number points"">8</td></tr><tr class=""odd"" data-people_id=""17855""><td class=""player large-link""><a href=""/players/simone-padoin/17855/"" class=""flag_16 left_16 italy_16_left"">S. Padoin</a></td><td class=""team large-link""><a href=""/teams/italy/juventus-fc/1242/"" title=""Juventus"">Juventus</a></td><td class=""number yellow-cards"">1</td><td class=""number red-cards"">2</td><td class=""number points"">7</td></tr><tr class=""even"" data-people_id=""61429""><td class=""player large-link""><a href=""/players/ivan-radovanovic/61429/"" class=""flag_16 left_16 serbia_16_left"">I. Radovanoviu0107</a></td><td class=""team large-link""><a href=""/teams/italy/ac-chievo-verona/1248/"" title=""Chievo Verona"">Chievo</a></td><td class=""number yellow-cards"">4</td><td class=""number red-cards"">1</td><td class=""number points"">7</td></tr><tr class=""odd"" data-people_id=""71325""><td class=""player large-link""><a href=""/players/segundo-victor-ibarbo-guerrero/71325/"" class=""flag_16 left_16 colombia_16_left"">V. Ibarbo</a></td><td class=""team large-link""><a href=""/teams/italy/cagliari-calcio/1256/"" title=""Cagliari"">Cagliari</a></td><td class=""number yellow-cards"">4</td><td class=""number red-cards"">1</td><td class=""number points"">7</td></tr><tr class=""even"" data-people_id=""71""><td class=""player large-link""><a href=""/players/daniele-de-rossi/71/"" class=""flag_16 left_16 italy_16_left"">D. De Rossi</a></td><td class=""team large-link""><a href=""/teams/italy/as-roma/1241/"" title=""Roma"">Roma</a></td><td class=""number yellow-cards"">4</td><td class=""number red-cards"">1</td><td class=""number points"">7</td></tr><tr class=""odd"" data-people_id=""139596""><td class=""player large-link""><a href=""/players/kalidou-koulibaly/139596/"" class=""flag_16 left_16 france_16_left"">K. Koulibaly</a></td><td class=""team large-link""><a href=""/teams/italy/ssc-napoli/1270/"" title=""Napoli"">Napoli</a></td><td class=""number yellow-cards"">4</td><td class=""number red-cards"">1</td><td class=""number points"">7</td></tr></tbody><tfoot><tr><td colspan=""5"">abbiamo assegnato punti per ciascun cartellino giallo (1 punto) e rosso (3 punti). Da notare che non rappresentano alcuna classifica ufficiale.</td></tr></tfoot></table><script type=""text/javascript"" charset=""utf-8"">(function(){var table = $("page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1_table");Popupizer.setup(table.select("tbody td[class*=""yellow-cards""]"), "player_events", { column: "yellow_cards" });Popupizer.setup(table.select("tbody td[class*=""red-cards""]"), "player_events", { column: "red_cards" });new PopupManager(table);})();n</script></div></div>n</div>n<script type=""text/javascript"" charset=""utf-8"">(function() {var block = new PaginatedBlock("page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1", "block_competition_playerstats_diciplinary", {""page"":0,""per_page"":15,""round_id"":27139,""season_id"":0});block.registerForCallbacks();block.setAttribute("has_previous_page", false);block.setAttribute("has_next_page", true);TimestampFormatter.format("page_competition_1_block_competition_playerstats_9_block_competition_playerstats_diciplinary_1");})();n</script></div>n""}},{""name"":""updateCallbackParams"",""parameters"":{""params"":{""round_id"":""27139"",""view"":""2""}}}],""timestamp"":""Sun, 04 Jan 2015 20:52:10 +0100""}"
" FORNOW: Output the first match group"s value to the console instead of assigning it to .Giocatore_ammonito.
Dim FirstMatchGroup As String = Regex.Match(Content, "<td class=\""player large-link\""s*>(.+?)<\/td>").Groups(1).ToString
Console.WriteLine("1st match group"s value")
Console.WriteLine("-----------------------")
Console.WriteLine(FirstMatchGroup & Environment.NewLine)
".Giocatore_ammonito = Regex.Match(Content, "<td class=\""player large-link\""s*>(.+?)<\/td>").Groups(1).ToString

" NOTE: What I think you really want is a scrubbed version of the first match group"s value (i.e. without all the backslash escaping).
Dim ScrubbedFirstMatchGroup As String = FirstMatchGroup.Replace("""", """").Replace("/", "/")
Console.WriteLine("1st match group"s value (scrubbed)")
Console.WriteLine("----------------------------------")
Console.WriteLine(ScrubbedFirstMatchGroup)

Wydaje następujące wyniki:

1st match group"s value
-----------------------
<a href="/players/rafael-marquez-alvarez/416/" class="flag_16 left_16 mexico_16_left">R. Mu00e1rquez</a>

1st match group"s value (scrubbed)
----------------------------------
<a href="/players/rafael-marquez-alvarez/416/" class="flag_16 left_16 mexico_16_left">R. Mu00e1rquez</a>