Wyrażenie regularne na ilość znaków

Wyrażenie regularne na ilość znaków
FV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 97
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.

Kopiuj
 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ć.

AM
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
4

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

Ferdynand Lipski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 77
2

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

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

EL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 143
1
tajny_agent
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1340
3

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

Kopiuj
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

Kopiuj
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:

Kopiuj
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.

FV
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 97
0
ambatakam napisał(a):

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

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

tak pomogło, dzięki

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.