Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wyrażenie regularne nie znajduje istniejących dopasowań.

Ostatnio zmodyfikowano 2019-05-11 18:38
Autor Wiadomość
Rashmistrz
Temat założony przez niniejszego użytkownika
Wyrażenie regularne nie znajduje istniejących dopasowań.
» 2019-05-11 04:53:06
C/C++
// g++ log.cpp -o logger-new.exe -lwinmm -std=c++17
#include <iostream>
#include <string>
#include <string_view>
#include <regex>


int main()
{
    std::string lines[] =
    {
        u8 "[2019-05-03 21:55:52] [Output] : MajsterTynek [377]: .",
        u8 "[2019-05-03 21:55:52] [Output] : MajsterTynek [377]: .test",
        u8 "[2019-05-03 21:57:48] [Input]  : say MajsterTynek [377]: .",
        u8 "[2019-04-30 17:01:16] [Output] : elfik1337 [214]: Wiesi3k. [31]: idź se klapnij",
        u8 "[2019-05-03 21:57:48] [Output] : MajsterTynek [377]: MajsterTynek [377]: .",
        u8 "[2019-05-03 21:55:52] [Output] : MajsterTynek [377]: asdf"
    };
   
    for( auto & line: lines )
    {
        std::string_view chk = line;
        chk.remove_prefix( 33 );
       
        {
            {
                std::smatch match;
                std::string text( chk );
                std::regex re { R "(^\S+ [\d+\]: [\.\?!t\s]+)" };
                if( std::regex_match( text, match, re ) )
                {
                    // tick = 0;
                    // ignored++;
                    continue;
                }
            }
           
            {
                std::smatch match_;
                std::string text_( chk );
                std::regex re_ { R "(^\S+ [\d+\]:[\s]+\S+ [\d+\]:)" };
                if( std::regex_match( text_, match_, re_ ) )
                {
                    // tick = 0;
                    // ignored++;
                    continue;
                }
            }
           
            std::cout << line << '\n' << std::flush;
            // ::PlaySound( message_sound, NULL, SND_ASYNC );
            // tick = 0;
        }
    }
}

Regex który napisałem nie wyłapuje mi wiadomości do zignorowania.
Chcę zignorować linie w których gracze piszą tylko wielokrotnie
konkretny symbol, jak i cytaty kopiuj-wklej innych graczy.

Jak na razie program potrafi wyłapywać tylko kropki,
ale nie wyłapuje cytatów tak jak bym tego chciał
i nie mam zielonego pojęcia jak to naprawić.

Kiedy używałem regex101 to działało (^\S+ [\d+]:[\s]+\S+ [\d+]:).
Regex101
Program praktycznie powinien zostawiać tylko:
[2019-05-03 21:55:52] [Output] : MajsterTynek [377]: .test
[2019-05-03 21:57:48] [Input]  : say MajsterTynek [377]: .
[2019-05-03 21:55:52] [Output] : MajsterTynek [377]: asdf
P-174610
pekfos
» 2019-05-11 06:56:41
std::regex_match() testuje czy tekst jest dopasowany w całości. Użyj std::regex_search(), albo uwzględnij to w wyrażeniu regularnym.
P-174611
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2019-05-11 18:38:56
Tak jak @pekfos powiedział.
Nie wiedziałem o istnieniu regex_search
i nie odróżniałem od regex_match.
Teraz program działa tak jak powinien.

Dziękuję za pomoc.
Powinienem częściej zaglądać do dokumentacji.
P-174612
« 1 »
  Strona 1 z 1