Wycinanie stringa z przeszkodami

0

Witajcie,

użytkownicy to bardzo kreatywne bestie. Mam system zapisywania pewnych danych

<rodzaj wniosku - dział - numer - nazwa>

w założeniach wszyscy zapisywali to tak:
A/IT/001 wniosek o szkolenie

ale oczywiście znajdują się tacy, co zapisują tak:
A_IT_001_wniosek o szkolenie
A_IT_001/wniosek o szkolenie
A/IT/001_wniosek o szkolenie
A_IT_001 wniosek o szkolenie itd.

Jak najefektywniej mogę pociąć stringa, żeby obsłużył każdą opcję? Jestem w stanie wyciągnąć A oraz IT (splitując po _ i po /) ale już 001_wniosek 001/wniosek sprawiają mi pewien problem bo są traktowane jako jeden ciąg znaków gdy wcześniej był użyty inny znak niż ten za jedynką.
Ostatecznie chciałbym otrzymać wynik na podstawie powyższych danych
A/IT/001 - 5 sztuk

Pozdrawiam

0

Najłatwiej byłoby to zwalidować już podczas zapisywania albo wręcz wymusić wpisywanie danych w jakieś odrębne pola.
Nie możesz zamienić np. każdego _ na / i po drugim wystąpieniu znaku specjalnego ignorować resztę?

0

Jeżeli pomiędzy "A,IT,001,wniosek o szkolenie" zawsze będzie jednen dowolny znak to zamiast dzielić po nich podziel po indeksie znaku np. używając substring z java.lang.String

0

zrób pattern matchera na wejściu i nie pozwól użytkownikowi zapisać dziwadeł.

0

A dlaczego użytkownicy wpisują te znaki? Powinni raczej wybierać z comboboksów (list rozwijanych).

0

to nie wchodzi w grę, bo może być
AA/ADM/0002_tralalala
ale chyba wielokrotny replace powienien dać radę.
Dzięki za podpowiedzi.

0

No ale tak czy tak obchodzą cię tylko 2 pierwsze wystąpienia znaku specjalnego, nie ważne ile pomiędzy nimi będzie liter.

0

Zastosuj jak człowiek wyrażenie regularne ([A-Z]+)[\W_]([A-Z]+)[\W_]([0-9]+)[\W_](.*) gdzie masz 4 grupy, które reprezentują poszczególne elementy identyfikatora rozdzielone znakiem nie będącym literą (\W) lub będące podkreśleniem ( zapis [\W_]).

0
  1. Wspomniane już wcześniej wyrażenia regularne. Ale to trochę słabe, bo prędzej czy później ktoś wklepie nowy rodzaj znaku.
  2. Skoro to użytkownicy wklepują - to może można po prostu rozbić numer na frontendzie na dwa pola (lub więcej), i dopiero potem je łączyć?
  3. Nieco prostsze rozwiązanie w wersji 2 - jak nie trzymają się formatu to rzucaj błędem.
0

@wartek01

ad1) Nowy rodzaj znaku nie zaboli ponieważ \W oznacza nie litery, nie cyfry oraz nie znak podkreślenia, a zapis [\W_] w praktyce oznacza, że znakiem rozdzielającym może być dowolny znak nie będący literą albo cyfrą.

ad2 & ad3) A może inaczej niech dostaną pole, która ma wszyte formatowanie i mechanizm wnioskowania (selecty, cokolwiek) o co chodzi. Zazwyczaj takie identyfikatory są budowane na podstawie kombinacji kilku innych identyfikatorów i można je zautomatyzować.

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