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

Wyrażenia regularne

Ostatnio zmodyfikowano 2016-01-18 00:43
Autor Wiadomość
Zdziszek
Temat założony przez niniejszego użytkownika
Wyrażenia regularne
» 2016-01-18 00:04:42
Witam, piszę program, który ma wczytać tekst z pliku i wyświetlić tylko te wyrazy, które mają pięć liter, kod:
C/C++
#include<iostream>
#include<regex>
#include<string>
#include<fstream>

void slowa( string nazwa )
{
    fstream plik( nazwa, ios::in );
    string wiersz;
    smatch mr;
    regex rx( "(\\U|\\L|\\s)([a-zA-Z]{5})(\\U|\\L|\\s)" );
    while( getline( plik, wiersz ) )
    {
        while( regex_search( wiersz, mr, rx ) )
        {
            cout << mr.str( 2 ) << " ";
            wiersz = mr.suffix();
        }
    }
    plik.close();
}

int main()
{
    slowa( "slowa.txt" );
   
    system( "pause" );
    return 0;
}

Problem polega na tym, że przy różnych zapisach program wiele słów po prostu obcina i wyświetla z nich 5 liter zamiast ich omijać. Przy takim zapisie, \L i \U mają oznaczać, że najpierw nie występuje ani mała ani duża litera, dopiero jak wystąpi mała lub duża litera lub spacja wtedy program ma szukać wyrazu na 5 liter oraz spacji po tym wyrazie. Wyskakuje mi błąd przy uruchamianiu:

Unhandled exception at 0x000007FEFD60B16D in zadanka kolos 2.exe: Microsoft C++ exception: std::regex_error at memory location 0x00000000001BE9A0.

Mógłby mi ktoś pomóc?Bo nie wiem w jaki sposób to zrobić jeśli wyraz zaczyna się np na początku wiersza lub na końcu, nie wiem jak zbudować wyrażenie, no i dlaczego wyskakuje taki błąd?
P-143710
pekfos
» 2016-01-18 00:12:00
Bez regexów cały program w mainie miałby 5 linii kodu. Musisz użyć wyrażeń regularnych..?
P-143711
Zdziszek
Temat założony przez niniejszego użytkownika
» 2016-01-18 00:15:00
Najpierw robiłem bez regexów, ale też mi coś nie działało, dlatego zacząłem z regexami
P-143712
pekfos
» 2016-01-18 00:21:27
To ich nie używaj. Nie ma tu podstaw do stosowania wyrażeń regularnych. Wystarczy odpowiednio wczytywać tekst.
P-143713
Zdziszek
Temat założony przez niniejszego użytkownika
» 2016-01-18 00:24:57
Szczerze to miałem jeszcze większy problem z tym zadaniem, gdy nie używałem wyrażeń regularnych, a w tym zadaniu bardziej mi chodzi o to, żeby je dobrze zrozumieć, bez użycia tych wyrażeń też mi się tego nie udało zrobić
P-143715
pekfos
» 2016-01-18 00:32:39
Szczerze to miałem jeszcze większy problem z tym zadaniem, gdy nie używałem wyrażeń regularnych, a w tym zadaniu bardziej mi chodzi o to, żeby je dobrze zrozumieć, bez użycia tych wyrażeń też mi się tego nie udało zrobić
Szczerze, to » KursyKurs C++ kurs.


Wczytywanie operatorem >>, to jest całe zadanie. Regexy to bardzo słabe rozwiązanie. Odpowiedź na pytanie, dlaczego to nie działa, masz w wyjątku, który powinieneś łapać, od kiedy tylko dostałeś ten komunikat błędu. To nawet bardziej logiczny tok postępowania, niż przeczytanie dokumentacji, czego też nie zrobiłeś. Jeśli chcesz coś tu dobrze zrozumieć, to nadrób braki, które masz na wielu poziomach zaawansowania w programowaniu w C++, od kompletnego minimum, do co najmniej poziomu regexów i wyjątków.
P-143716
Zdziszek
Temat założony przez niniejszego użytkownika
» 2016-01-18 00:43:27
Ok, dzięki
P-143718
« 1 »
  Strona 1 z 1