Boost - wyrażenia regularne

0

Mam problem ze sformuowaniem wyrażenia regularnego.
W tej chwili mam coś takiego:

const std::wstring wyrazenia::actDef = str(wformat(L"%s(?:\\s?)([^[:digit:]]*)\\)(?:\\s?)(%s)\\s(%s)(%s)\\s([^,\\s]+)")%PromulgatorBezRoku%separator%actDefFrazy%separator);
const std::wstring wyrazenia::actDefDwuczlon = str(wformat(L"%s(?:\\s?)([^[:digit:]]*)\\)(?:\\s?)(%s)\\s(%s)(%s)\\s(pr\\.\\s[^,\\s]+\\.)")%PromulgatorBezRoku%separator%actDefFrazy%separator);
const std::wstring wyrazenia::actDefTrzyczlon = str(wformat(L"%s(?:\\s?)([^[:digit:]]*)\\)(?:\\s?)(%s)\\s(%s)(%s)\\s(pr\\.\\so\\s[^,\\s]+\\.)")%PromulgatorBezRoku%separator%actDefFrazy%separator);

Chciałabym połączyć te trzy wyrażenia w jedno. I tak dla przykładu próbowałam zrobić tak:

const std::wstring wyrazenia::actDef = str(wformat(L"%s(?:\\s?)([^[:digit:]]*)\\)(?:\\s?)(%s)\\s(%s)(%s)\\s(([^,\\s]+)|(pr\\.\\s[^,\\s]+\\.)|(pr\\.\\so\\s[^,\\s]+\\.))")%PromulgatorBezRoku%separator%actDefFrazy%separator);

Dla przejrzystości wyeksponuje fragment, który sprawia mi problem:

(([^,\s]+)|(pr\.\s[^,\s]+\.)|(pr\.\so\s[^,\s]+\.))

Teoretycznie do takiego wyrażenia powinny przypasować zarówno u.k.k. jak i pr. bud. czy pr. o stow. Niestety jednak, w takim zapisie wychwytuje tylko u.k.k. Jeśli natomiast zamienię miejscami konkretne przypadki:

((pr\.\s[^,\s]+\.)|([^,\s]+)|(pr\.\so\s[^,\s]+\.))

Wychwytuje już jedynie pr. bud., a pozostałych przypadków nie.

Oczywiście fragment: ([^,\s]+) wychwytuje również pr. (bez bud. czy o stow.), ale takie rzeczy są korygowane dalej w kodzie.

Czy ktoś wie może czemu tak się dzieje mimo użycia lub?

//q: usunalem nadmiarowe \ w 'czystych' regex na koncu postu dla czytelnosci

0

a co owo ([,\s]+) ma lapac? przeciez to lapie praktycznie wszystko.. nie rozumiem, jakie frazy dokladnie chcesz lapac. jesli mialbym strzelac - przesun owo ([,\s]+) na koniec alternatywy, albo uzyj niezachlannego +'a

0

Ma łapać ciąg znaków nie zawierający spacji i przecinka.
Przesunięcie tego na koniec alternatywy sprawia, że przestaje mi łapać takie wyrażenia... a zachłanność jest tu zdecydowanie potrzebna, jeśli ma łapać (pr.\so\s[,\s]+.) przy jednoczesnym łapaniu ([,\s]+)...

Może podam przykłady wyrażeń, które mają być złapane:

aaa.a.a.a.
pr. aaaaa.
pr. o. aaaa.a.a.

Wystąpienie każdego z nich musi zostać odnotowane. Tymczasem w obecnej postaci dostaję taką listę:

aaa.a.a.a.
pr.
aaaaa.
pr.
o.
aaaa.a.a.

Przy okazji zapytam - dlaczego w alternatywie kolejność ma znaczenie? I co powoduje zmiana kolejności?

0

1' sprobowales zamiany? jaki byl efekt?

Przy okazji zapytam - dlaczego w alternatywie kolejność ma znaczenie? I co powoduje zmiana kolejności?

niby nic, ale kolejnosc sugeruje wykonywaczowi, w jakiej kolejnosci ma probowac sciezek, i co prawda sprawdzi wszystkie/wiekszosc aby wykluczyc istnienie dluzszych dopasowan, ale jesliby sie trafilo kilka dopasowan tej samej dlugosci, to juz capture'y moglyby sie zmienic.. blahblah

czyli, jezeli dobrze rozumiem, chcesz lapac dowolny ciag znakow-niespacji-nieprzecinkow, ewentualnie poprzedzony prefixem 'pr.' i/lub 'o.'?

Co do Twojego wyrazenia: (([,\s]+)|(pr.\s[,\s]+.)|(pr.\so\s[^,\s]+.))
po usunieciu nawiasow, alternatywa trzech:
[^,\s]+
pr.\s[^,\s]+.
pr.\so\s[^,\s]+.
i wychodza bledy: pierwszy czlon oczywiscie ok, ale drugi i trzeci - czemu kropka na koncu? moze wlasnie ona nie trafia? no i w trzecim czlonie na pewno zapomniales kropki po 'o', w przykladach powyzej piszesz wyraznie "pr. o."; wyglada na blad kopiuj-wklej sekwencji [^,\s]+ o jeden znak w lewo za blisko

btw. te nawiasy tez nie potrzebne sa, bo alternatywa i tak jest top-level zawsze.. chyba ze zostawiasz je specjalnie jako capture'y 1-z-3, zeby wiedziec ktora opcja trafila?

0

Wielkie dzięki za pomocną odpowiedź :) Faktycznie głupie kropki i kolejność - teraz śmiga :)

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