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