Wyszukiwanie danych z wykorzystaniem symboli: *-dowolny ciąg i ?-dowolny znak

0

Witam, mam za zadanie napisać program (w języku C) realizujący funkcje spisu książek: wyświetlanie pozycji, wstawianie nowych pozycji, edytowanie już istniejących,usuwanie, zapis danych do pliku i odczyt ich,
ORAZ:

Wyszukiwanie danych z wykorzystaniem symboli -dowolny ciąg ?-dowolny znak (według łączonego kryterium np.: autor: S i rok_wydania: 1991)

Ogarnąłem wszystkie podpunkty, oprócz wyszukiwania do, którego zbytnio nie wiem jak się zabrać;(

Jakieś pomysły lub wskazówki, będę wdzięczny?

0

Regexpy.

0

Sprawdzanie znak po znaku z ewentualnym cofaniem się

MATCHED = True
FAIL = False

# s - string; p - pattern
def M(s, p):
    if s=="" and p=="":          return MATCHED
    if s=="" and p=="*":         return MATCHED
    if s=="" or  p=="":          return FAIL
    if s[0]==p[0]:               return M(s[1:], p[1:])
    if p[0]!="*" and s[0]!=p[0]: return FAIL

    # sprawdzanie gwiazdki
    for i in range(len(s)):
        if M(s[i+1:], p[1:]):
            return MATCHED
    return FAIL

# testy
print [
    M("", "*"),
    M("a", "*"),
    M("aa", "a*"),
    M("aaa", "a*"),
    M("ala", "a*a"),
    M("baba", "b*a"),
    M("babababa", "b*b*"),
    M("baba baba", "b*b*a"),
    M("baba baba", "*"),
    M("baba baba", "**"),
    M("baba baba", "***"),
    M("baba baba", "****"),
    not M("a", "aa"),
    not M("a", "b"),
    not M("aba", "abb"),
    ]
0

dzięki, już coś czaje;)
ale mam jeszcze jedno pytanie:
Korzystam z funkcji
int regcomp (regex_t *preg, const char *pattern, int cflags);
ta funkcja kompiluje podany ciąg znaków (pattern) na wzorzec (preg) wykorzystywany później w wyszukiwaniu.

Jaką mam zastosować cflags-typ kompilacji aby uzyskać później wyszukiwanie z użyciem znaków: ?-dowolny znak, *-dowolny ciąg znaków.

Znalazłem coś takiego:

Argument cflags jest alternatywą bitową żadnej lub więcej z poniższych flag:
REG_EXTENDED
Użycie składni rozszerzonych wyrażeń regularnych (POSIX Extended Regular
Expressions – ERE) podczas interpretowania wzorca. Gdy flaga nie jest ustawiona,
używana jest składnia podstawowa (POSIX Basic Regular Expressions – BRE).
REG_NEWLINE
Znak nowej linii traktowany jest jak zwykły znak.
REG_ICASE
Nie rozróżnia wielkich i małych liter we wzorcu.
REG_NOSUB
Zwraca jedynie powiadomienie o szukaniu zakończonym sukcesem/porażką w funkcji
regexec(). Wówczas parametry nmatch oraz pmatch są ignorowane (brak jest
adresowania znalezionych dopasowań).

Ale żadna nie daje pełnego efektu. Czy może ktoś zna działanie regcomp() i mógłby mi poradzić jaką użyć cflags w niej?

0

W wyrażeniach regularnych znaki * i ? oznaczają coś innego, niż jest Tobie potrzebne. Musisz dokonać zamiany tych znaków przed kompilacją, odpowiednio ".*" (0 lub wiecej dowolnych znakow) i "." (dowolny znak)

0

dzięki za radę, właśnie wykombinowałem z " . ", ale nie mogłem dojść jak zrobić ten dowolny ciąg.
Teraz już sobie poradzę;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1