Expresie regulată pentru a se potrivi cu două șiruri în stare AND

Sunt nou în expresia regulată, vă rugăm să ajutați-mă pe scenariul de eroare în cazul în care am nevoie pentru a utiliza regex pentru a se potrivi două mesaje de eroare (care apar în diferite linii, dar același paragraf) în condiție AND dintr-un fișier jurnal:

Msg1 - EROARE [com.company.util.ejb.TimedBean]() FAILED procesare Loader

Msg2 - java.lang.RuntimeException: Codul mesajului: [SL] este necunoscut.

Basically, what I need is to match (msg1)&&(msg2), in this case, (ERROR...Loader) will appear in the first line and (java...unknown) will follow in the next line. The messages will always follow this order. I am not programming in any typical language here, they will be put into a enterprise tool that accepts regexp.

Dacă este posibil, puteți să-mi arătați cum să faceți acest lucru în starea sau ca (msg1) || (msg2) ?

0
Nu este clar ce vrei sa obtii ... Poti sa explici betteR?
adăugat autor aleroot, sursa

1 răspunsuri

Matching two consecutive lines is, in theory, just a matter of putting the two regular expressions end-to-end. So for purposes of illustration, let's say you've got a file named logfile.txt that contains messages you're looking for. Then from a Linux command line you could do something like this:

pcregrep -M -o '^ERROR\N*Loader$\njava\N*unknown\.$\n' logfile.txt

and it would print the line pairs that you're looking for. Breaking it down into parts:

  • ^ERROR matches the word ERROR at the beginning of a line.
  • \N* matches any number of characters that aren't a line terminator.
  • Loader$ matches the word Loader at the end of a line.
  • \n matches the newline character. (Might be different on Windows.)
  • java\N*unknown\.$\n is more of the same.

DAR ... Și aceasta este o problemă mare ... Instrumentul care se ocupă de expresia dvs. regulată trebuie să fie capabil să facă meciuri cu mai multe linii, iar capacitatea trebuie să fie activată. (Aceasta este ceea ce permite -M opțiunea de linie de comandă pcregrep .) Multe instrumente regexp, cum ar fi grep efectuați căutări multiple. Deci, poate că nu aveți noroc.

0
adăugat
Multumesc csd. Nu știu de ce, dar "\ N" nu funcționează în instrumentul meu (poate că nu am pus-o corect). Am reușit să activez funcția de potrivire multi-linie. Regexp-ul final folosit a fost /(ERROR. * \ N). > - nu arată la fel de eficient ca al tău, dar funcționează pentru mine!
adăugat autor Madean, sursa
Hmm ... Aici este mai bine: /ERROR.java \ .lang \ .RuntimeException \: Codul mesajului \: \ [SL \] este necunoscut
adăugat autor Madean, sursa
Dacă nu este acceptat \ N , îl puteți scrie ca [^ \ n] (adică clasa de caractere care nu este \ n ). Motivul pentru care ați putea dori să faceți acest lucru (în loc să utilizați doar . ) este că nu doriți ca expresia dvs. regulată să se potrivească din partea de sus a fișierului până la ultimul meci de la fund.
adăugat autor csd, sursa