Wyrażenie regularne na ilość znaków

0

Jak napisać regexa w C++ na coś takiego:
dssdsd1954.tga
4567.tga
że jak końcówka pliku to 4 numery i .tga to by przechodziło.

 std::regex pattern{ "[0-9]*\\.tga$" };
 if (!std::regex_search(filename, pattern)) {
    std::cout << "not pass" << std::endl;
    continue;
}

Podejrzewam że coś potrzebuje zamiast * bo to oznacza "0,1 or more sequence". Jest też prec{4} ale jak to dodać. Ta składnia to jest naprawdę nieporozumienie kompletne, w ogóle w open source'ie nie przemyśleli tego dobrze jak zrobić aby to czytelne wszystko było. Pewnie review im nikt nie robił kto sie na tym nie zna bo taka osoba świeżym umysłem by dała input chłopakom, hej to dziadostwo, nie może tak być.

4

Zmień * na {4} i powinno przejść.

2

^.*\d{4}\.tga$

Nada się?
https://regex101.com/r/sLfdHY/1

1
3

A to koniecznie musisz zaprzęgać do tego regexa?

constexpr bool is_desired_filename(std::string_view const filename) noexcept
{
    if (filename.length() > 3) {
        char const* digits = "0123456789";
        return filename.find_first_not_of(digits, filename.length() - 4 ) == std::string_view::npos;
    }
    return false;
}

Wyciągnięcie rozszerzenia to też kilka linijek

std::tuple<string_view, string_view> detach_extension(string_view filename)
{
  if (auto dot = filename.find_last_of('.'); dot != filename.npos) {
    return {filename.substr(0, dot), filename.substr(dot + 1)};
  }
  return {filename, {}};
}

Kończy się na:

void func()
{
  auto [basename, ext] = detach_extension(filename);
  return ext.compare("tga") == 0 ? is_desired_filename(baseame) : false;
}

Wszystko na string_view, więc zero alokacji.

0
ambatakam napisał(a):

Zmień * na {4} i powinno przejść.

 std::regex pattern{ "[0-9]{4}\\.tga$" };

tak pomogło, dzięki

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