Błąd o niepoprawnej wstecznej referencji w wyrażeniu regularnym

0

std::regex r(R"((x*)\s+(?!\1).+)");

jak sie skompiluje z -stdlib=libc++ https://godbolt.org/z/vPqWaEhGc

libc++abi: terminating with uncaught exception of type std::__1::regex_error: The expression contained an invalid back reference.

wersja z -stdlib=libstdc++ nie ma problemów https://godbolt.org/z/8Gj1h3M3K

Pojawiło mi się jak w clang chciałem uzyc takiego projektu https://github.com/jeremy-rifkin/libassert

1

Na szybkości znalazłem coś takiego: https://stackoverflow.com/questions/14972425/should-i-use-libc-or-libstdc
być może to stanowi jakiś problem, ale z tego co widzę, nie jesteś pierwszy z tym problemem:
https://github.com/jeremy-rifkin/libassert/issues/15 , a dokładniej on dotyczy tego (?!\1) fragmentu

2
Adamek Adam napisał(a):

std::regex r(R"((x*)\s+(?!\1).+)");

jak sie skompiluje z -stdlib=libc++ https://godbolt.org/z/vPqWaEhGc

libc++abi: terminating with uncaught exception of type std::__1::regex_error: The expression contained an invalid back reference.

wersja z -stdlib=libstdc++ nie ma problemów https://godbolt.org/z/8Gj1h3M3K

Pojawiło mi się jak w clang chciałem uzyc takiego projektu https://github.com/jeremy-rifkin/libassert

Wydaje się poprawne - chodzi o negative look-ahead z referencją do poprzedniej grupy. Przyjazne miejsce dla wszelkich bugów w silnikach do regexpów.

0

Chyba ten regexp jest jakis trudny , pierwszy z github-a RE2 nie dał rady Error parsing '(x*)\s+(?!\1).+': invalid perl operator: (?!

Jakoś zawsze byłem negatywnie nastawiony do rozwiązywania problemów za pomocą regexpów ale słyszałem że potężne narzędzie dla tych co umieją z tego korzystać, albo nie miałem takich problemów które powinno sie rozwiązywać za pomocą regexpa :D

0

GPT-4 sugeruje coś takiego:

#include <iostream>
#include <regex>
#include <string>

int main() {
    std::string input = "xx   yyy";
    std::regex pattern("((x*)\\s+(?!\\1).+)");

    if (std::regex_match(input, pattern)) {
        std::cout << "Matched!" << std::endl;
    } else {
        std::cout << "Not matched!" << std::endl;
    }

    return 0;
}
2

Odradza się używania std::regex. Jest wolny (zarówno w kompilacji jak i w działaniu, patrz https://github.com/HFTrader/regex-performance) i jak widać problematyczny w użyciu z zaawansowanymi regexami, a ze względu na wsteczną kompatybilność ABI nie da się za bardzo tego zmienić i teraz siedzi na wieki wieków taki kalafior w bibliotece standardowej aby kolejne generacje użytkowników mieli się na co nadziewać. Wersja z Boost Regex kompiluje mi się bez problemu:

// g++ test.cpp -o test -lboost_regex
#include <boost/regex.hpp>
#include <cassert>

int main() {
    boost::regex r(R"((x*)\s+(?!\1).+)");
    assert(boost::regex_match("xxx xxy", r));
    assert(!boost::regex_match("xxx xxx", r));
}

Są i inne implementacje, do wyboru do koloru.

0

Zastanawiam się, czy w tym przypadku nie ma może rozwiązania alternatywnego z użyciem negative/positive-lookbehind.

0

zgłosiłem błąd do autora projektu on zgłosił problem do llvm ale skoro to jest blad poziomu biblioteki standardowej to raczej nie ma co liczyć że ktoś to poprawi, wiec tylko jeszcze wysłałem linka z benchmarkiem różnych bibliotek regexp

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