Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Regex crash'uje program


Rekomendowane odpowiedzi

Opublikowano

Witam.
Mam dzisiaj taki problem z regex'em mianowicie działa on na wyciętym  kawałku tekstu który zawsze spełnia  jego wymagania.
Jego zadaniem jest wyciągnięcie nazwy z "href'a" który jest zagnieżdżony w kodzie strony.
Niestety jeśli przez pierwszy regex który sprawdza tylko czy na pewno wycięto dobry kawałek tekstu zmienna "str"(czyli nasz wycięty wcześniej kawałek tekstu) przechodzi bez problemu 

tak już kiedy będzie musiała ona wyszukać nazwę crash'uje cały program. Doszedłem do tego że jest to spowodowane zmienną string ale niestety nie rozumiem dlaczego.
Dołączam zapytanie oraz wycinek przy którym crashuje 
 

Regex bez "\":
 

<a\shref="\/(.*)"\sclass\="link-blue"\sdir="ltr">

Kawałek kodu który wywołuje błąd:

 

regex zapytank2("<a\\shref=\"\\/(.*)\"\\sclass\\=\"link-blue\"\\sdir=\"ltr\">");
smatch wynik;
if(regex_search(str,wynik,zapytank2))
{
       string name=wynik[1];

 


Zawartość zmiennej str:

 

<div class="questionBox" id="question_box_114147734344"><div class="question" dir="ltr">  <span class="text-bold"><span dir="ltr">Demony są wśród nas?</span></span>?<span class="author nowrap"><a href="/Niyane" class="link-blue" dir="ltr">v e t e r a n ?</a></span></div><div class="reportFlagBox ">  <a href="/kochanadiablica/questions/114147734344/report_answer" class="reportFlag hintable" hint="Zgłoś" onclick="RLTLogger.execute("CtxPointer", "Complain.mark");$.colorbox({href:"/kochanadiablica/questions/114147734344/report_answer",title:"Zg\u0142o\u015b"}); return false"></a></div><div class="answer" dir="ltr">  Trzy raz ja! Przechodzę dalej!<br/>.<br/>Im częściej mówię ja, mój, moje, swoje, mnie, mojego, swego tym bardziej czuję się jak egoistka. Czy to normalne?<br/>.<br/>- A co w tym życiu jest normalne? - pyta posępna Miss Black wpatrując się we mnie dzikimi ślepiami spod ciemnej grzywki. A może gwiazdy? Pod ciemną gwiazdą to ona się na pewno urodziła.<br/>- Wszystko słyszę. - syczy niczym rozjuszony kot, po czym jeden z kącików jej ust wędruje ku górze. - Boisz się, prawda?<br/>- Czego znów? - odzywa się Pani Sprzeczność mierząc Czarną Istotę zirytowanym spojrzeniem.<br/>- Pewnie tego co zwykle.. - odzywa się melancholijnie Hija.<br/>.<br/>I oto jest. Burdel na stu kółkach, wewnętrzny rozpierdol osobowości. W sumie to mogę je tworzyć na zamówienie ze scenariuszem i opisem wyglądu gratis. Jeśli jesteś zainteresowany, dzwoń.<br/>.<br/>- Co ty pierdolisz.. - ruga mnie Czarna odpalając czerwonego malboro.<br/>- Zważaj na słowa, bo znów zostaniesz zamknięta za solidnym, umysłowym murem. - dogryza jej Pani S uśmiechając się triumfująco. Zbyt wczesna radość. Miss Black taksuje ją obojętnym spojrzeniem, po którym wręcz przechodzą człowieka ciarki. W końcu uśmiecha się z kpiną wypuszczając dym spomiędzy lekko rozchylonych warg.<br/>- Solidny mur, mówisz? Więc czemu tu jestem? - pyta, świdrując kocimi oczami swą rozmówczynię.<br/>- Dziewczęta, nie kłóćcie się! ONA ma już i tak zbyt dużo chaosu w głowie, i to po części nasza sprawka. - odzywa się piskliwie Hija.<br/>- Nikt cię o zdanie nie pytał. - burczy Black podsuwając ramę papierosów pod nos Pani S - Częstuj się. Dziś jestem miłosierna. - mówi kusząco wyczekując reakcji.<br/>- Miałaś nie palić, palenie JEJ szkodzi! Nie daj się omamić sztuczkom tej podstępnej osobowości. To przecież tylko alter ego.. - przekonuje z zapałem dobra wersja mnie.<br/>- Tylko? Tylko alter ego? - przysuwana do Pani S paczka ginie natychmiast w kieszeni ciemnej, skórzanej kurtki. Miss Black podnosi się powoli z krzesła podchodząc wolno do swojego przeciwieństwa. Hija kuli się w sobie od samego patrzenia na swoją Czarną Siostrę. - Nie jestem "tylko" alter ego. Jestem "aż" alter ego. Naucz się tego w końcu, ty słaby, naiwny tworze.<br/>- Black, nie przesadzaj już z tą nienawiścią. - zabiera w końcu głos Sprzeczność.<br/>- Ja przesadzam?<br/>- Jak zwykle kłótliwa. - nie daje za wygraną z komentarzami. Miss Black nachmurza się. Wygląda teraz jak śmierć, jak upadły anioł. Blada, ubrana na czarno, lekko podkrążone oczy, mocno wytuszowane rzęsy. Usta zaciśnięte w wąską kreskę. Brakuje jej tylko skrzydeł by zostać śmiercionośnym pierzakiem. Marszczy gniewnie brwi, zaciskając mocno pięści. Wewnętrzne mury umysłu drżą nagle w posadach od jej skumulowanej mocy, zwanej nienawiścią.<br/>- Jak ja was nienawi...<br/>DOŚĆ. WYSTARCZY TEGO DOBREGO. Czy aby na pewno dobrego?<br/>- Obudziłaś ją, ty idiotko! - warczy ochryple Pani S i wraz z Hiją zaczynają powoli rozpływać się w powietrzu. Czarna uśmiecha się. Ona nie zniknie. Od niej się nie uwolnię. Takie to już przekleństwo nas.. bliźniaczek syjamskich.<br/>.<br/>Słodkich koszmarów Siostry Chaosu.<br /><a href="/kochanadiablica/answer/114147734344/photo/animated" class="photoAnswer-zoom" data-rlt-aid="zoom_photo_answer" onclick="$.colorbox({href:"http://gif1.ask.fm/animated_gifs/005/983/508/480/animated/tumblr_mlcryk57TS1s907jwo1_500.gif",maxWidth:App.opt.popup_avatar_outer_width,maxHeight:App.opt.popup_avatar_outer_height,onLoad:function(){this.t0=RLT.Util.now();},onComplete:function(){RLTME.put('img_pop',RLT.Util.now()-this.t0);},imgError:App.previewPhotoError}); return false"><span class="mediaAnswer-container photoAnswer-headSpace"><img alt="Demony są wśród nas?" class="photoAnswer-XL" src="http://gif1.ask.fm/animated_gifs/005/983/508/480/preview/tumblr_mlcryk57TS1s907jwo1_500.gif" /><img class="mediaPlayIcon" src="/images/buttons/icon-mediaPlay-gif.png"/></span></a></div><div class="time"><a href="/kochanadiablica/answer/114147734344" class="link-time" data-rlt-aid="answer_time">2 miesiące temu</a></div><div class="likeCombo" id="like_box_114147734344"><div class="likeBox">  <span class="like-active" style="display:none"></span><div class=" ghostLink">  <a class="like hintable" hint="Lubię to" href="#" onclick="Like.quickLike(114147734344, "JerryThinks", "/likes/kochanadiablica/question/114147734344/add"); return false;" style="display:block"></a></div>  </div>  <div class="likeList you-like-block" style="display:none">Ty i <a href="/likes/kochanadiablica/question/114147734344/people" class="link-blue" onclick="$.colorbox({title:"Osoby, kt\u00f3re to lubi\u0105",onComplete:Likes.onPeopleOpening,onCleanup:Likes.onPeopleClosing,href:"/likes/kochanadiablica/question/114147734344/people"}); return false">253 innych</a> lubicie to  </div><div class="likeList people-like-block"><a href="/likes/kochanadiablica/question/114147734344/people" class="link-blue" onclick="$.colorbox({title:"Osoby, kt\u00f3re to lubi\u0105",onComplete:Likes.onPeopleOpening,onCleanup:Likes.onPeopleClosing,href:"/likes/kochanadiablica/question/114147734344/people"}); return false">253 osób</a> lubi to</div></div>  </div>   

 



Debug'er dodany do QT Creatora mówi że błąd znajduje się w pliku regex_compiler.h w lini 269:

 

      bool
      operator()(_CharT __ch) const
      { return _M_apply(__ch, typename is_same<_CharT, char>::type()); }

      bool
      _M_apply(_CharT __ch, true_type) const
      {
	auto __c = _M_translator._M_translate(__ch);
	auto __n = _M_translator._M_translate('\n');
	auto __r = _M_translator._M_translate('\r');
	return __c != __n && __c != __r;
      }

 

 

Opublikowano

std::regex może rzucić wyjątek jeśli z wyrażeniem jest coś nie tak - całkiem możliwe że to dlatego ci kończy program(tak to jest jak się nie łapie wyjątków). Sprawdź czy tak się nie dzieje, a jeśli tak to sprawdź jaki ma komunikat.

Opublikowano

Okey tak jak tez chciałeś wyjątek dodany cały czas program jednak nie chce współpracować :
Błąd na 100% leży w zmiennej str ponieważ gdy ją zmieniłem na statyczny string bezproblemowo przechodziło pozytywnie lub też negatywnie if'a w zależności od stringu
 

regex zapytank2("<a\\shref=\"\\/(.*)\"\\sclass\\=\"link-blue\"\\sdir=\"ltr\">");
smatch wynik;
try{
   if(regex_search(str,wynik,zapytank2)){
      [....]
   }
   catch(std::regex_error& e){
      cout<<e.code();
}

PS. Wydaje mi się że dobrze zrozumiałem to co napisałeś jeśli jednak tak nie jest to z góry przepraszam i proszę o wyprowadzenie mnie z błędu :-)

Opublikowano

Konkretniej to konstruktor std::regex może rzucić wyjątek, to też musisz sprawdzić.

Opublikowano

Na przykład rozpocząć blok try nieco wyżej?

try{
   regex zapytank2("<a\\shref=\"\\/(.*)\"\\sclass\\=\"link-blue\"\\sdir=\"ltr\">");
   smatch wynik;
   if(regex_search(str,wynik,zapytank2)){
      // ...
   }
   catch(std::regex_error& e){
      cout<<e.code();
   }
}

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...