Pomoc z wyrażeniem regularnym

0

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.

0

W jednym regexpie chyba nie, musisz policzyć ilość znalezionych grup.

2

Pojedynczy regex dla czegoś takiego mógłby być długi i ciężki w zmianach. Prościej może być dopasować szukany ciąg a potem sprawdzić czy występują pozostałe.

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