Wycinanie stringa z przeszkodami

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

caer
  • Rejestracja:około 11 lat
  • Ostatnio:11 miesięcy
  • Postów:465
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ę?

Soderlight
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:38
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

edytowany 1x, ostatnio: Soderlight
wojciechmaciejewski
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 lata
  • Postów:560
0

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

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

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


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
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.

caer
  • Rejestracja:około 11 lat
  • Ostatnio:11 miesięcy
  • Postów:465
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.

Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:13 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
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_]).


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 godziny
  • Postów:3584
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.
caer
numer 3 mi się wyjątkowo podoba
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:13 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
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ć.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.