regex funcționează pe regex tester dar nu și în c++ (Programare, C++, Regex, Ghilimele)

Mike Drakoulelis a intrebat.
a intrebat.

Încerc să obțin conținutul dintre ghilimele dintr-un fișier și folosesc regex. Acesta este regex-ul pe care îl folosesc:

id=
([^
]+)
|title=
([^
]+)

După cum puteți vedea, fiecare caracter special este scăpat. Funcționează perfect în regex tester, dar când este folosit în codul c++, titlul nu este găsit. ID-ul este întotdeauna găsit foarte bine. Am încercat mai multe variante și chiar am eliminat jumătate din el (înainte de |)

id="60973129" title="EPA"

Acesta este codul C++ pe care îl folosesc:

std::regex rgx("id=
([^
]+)
|title=
([^
]+)
");
std::smatch match;

if (std::regex_search(line, match, rgx)) {
    for (int i=0; i < match.size(); ++i) {
            std::cout << match[i];
    }
}

EDIT: Am constatat că, dacă este pus separat, codul title=
(.+?)
funcționează, dar atunci trebuie să folosesc mai multe regexuri, ceea ce îmi anulează scopul, deoarece va trebui să scanez linii mai lungi mai târziu.

Comentarii

  • Poți să arăți codul în care este folosit efectiv ? –  > Por JBL.
  • Nu aceasta este problema, dar acest lucru ar putea fi simplificat prin utilizarea unor repetări fără greșeală. În loc de
    ([^
    ]+)
    încercați
    (.+?)
    . –  > Por Pete Becker.
  • Probabil că este doar o problemă cu fragmentul, dar se pare că treceți match2 în regex_search, apoi iterați peste match. –  > Por Chris W..
  • Da, aceasta este doar o greșeală între fragmente. Îmi pare rău! –  > Por Mike Drakoulelis.
1 răspunsuri
user1676075

Probabil că funcționează într-un tester pentru că spune „se potrivește ceva” în interiorul șirului, spre deosebire de „se potrivește întregul lucru”.

Oricum, | este un „sau”, găsiți unul sau celălalt. Pentru a se potrivi cu șirul așa cum este arătat, schimbați | fie cu un spațiu, fie cu un indicator pentru orice cantitate de spațiu alb, cum ar fi [ t]+ și bănuiesc că va funcționa bine atunci.

Comentarii

  • Nu obțin rezultate nici cu id=
    ([^
    ]+)
    title=
    ([^
    ]+)
    nici id=
    ([^
    ]+)
    [ t]+title=
    ([^
    ]+)
    –  > Por Mike Drakoulelis.