Czołem Bracia w kodzie
Poprzednio źle w temacie opisałem na czym rzecz polega jako że daaawno już tematów tutaj nie zakładałem, to robię to ponownie, tym razem porządnie.
Otóż będę otrzymywał dane w takiej postaci:
struct TagsGroup
{
QString groupName;
QVector<QString> tags;
QString validator;
QString errorMessage;
};
QList<TagsGroup>
następnie owe tags będą sklejane w pojedynczy, większy QString; nie wszystkie, jest edytor GUI który użytkownikowi pozwala wybrać których tagów użyć. Założeniem dostawcy danych jest możliwość sprawdzania ich poprawności, co będzie się odbywało poprzez pole validator. Ja po swojej stronie nie będę miał wiedzy jakie grupy przyjdą, jakie i ile tags będą zawierały, i co będzie w walidatorze (poza tym, iż jest to QString do zrobienia QRegularExpression).
Jednym ze szczególnych przypadków o którym wiem, że może(acz nie musi) występować jest "one of these and no other of them", czyli powiedzmy jest sobie zestaw tagów w grupie: "unit_mech", "unit_vehicle", "unit_turret". I teraz w tym zbiorczym stringu któryś z wymienionych tagów musi się znaleźć, ale tylko jeden - wystąpienie któregokolwiek zarazem powinno banować wystąpienia pozostałych.
Do tego potrzebuję regexa który:
- uzna za poprawne następujące QStringi
"unit_mech
range_long
bracket_medium"
oraz
"unit_turret"
- z kolei odrzuci następujące
"unit_vehicle
range_medium
unit_turret" //źle, bo wystąpiły dwa stringi z tej samej grupy unit_
"range_short
bracket_light" //tu też źle bo nie ma żadnego taga z grupy unit_
Nie jestem niestety mistrzem regexów, póki co mam takiego:
^\b(unit_(mech|turret|vehicle){1})\b
ten regex prawidłowo wykrywa brak tagów unit_, ale nie sprawdza się przy wykluczaniu wystąpień - zatem proszę Was Bracia o wskazówki jak dorobić wykluczanie pozostałych fraz.
EDIT:
Aktualizacja - coś rusza do przodu, słowo-klucz to jak się okazuje 'negative lookahead':
^(?!.*unit_(turret|vehicle)).*unit_mech.*$
taki regex prawidłowo odrzuca stringa
unit_turret unit_mech
niestety nie działa jak mech jest w nowej linii, no i wciąż jest zahardkodowane sprawdzanie konkretnych fraz a nie "jedna z podanych". No ale zawsze jakiś postęp jest.