Wystarczy użyć odpowiedniej metody: String#split()
.
String string = "004-034556";
String[] parts = string.split("-");
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556
Pamiętaj, że to wyrażenie regularne , więc pamiętaj, aby w razie potrzeby unikać znaków specjalnych .
tam jest 12 znaków ze szczególnych znaczeń: odwrotny ukośnik \
, daszek ^
, znak dolara $
, okres lub kropka .
, bar lub rura pionowa symbol |
, znak zapytania ?
, gwiazdka lub gwiazda *
, znak plus +
, nawiasem otwierającym (
, nawiasem zamykającym )
oraz otwierający nawias kwadratowy [
, otwierający nawias klamrowy. {
Te znaki specjalne są często nazywane „metaznakami”.
Tak więc, jeśli chcesz podzielić na przykład okres / kropka .
, która oznacza „ dowolny znak ” w regex, użyć backslash\
uciec indywidualny znak specjalny jak tak split("\\.")
lub użyć klasę postaci[]
reprezentować znaki liter (y) jak tak split("[.]")
lub wykorzystanie Pattern#quote()
do uciec tak cały łańcuch split(Pattern.quote("."))
.
String[] parts = string.split(Pattern.quote(".")); // Split on period.
Aby wcześniej sprawdzić, czy ciąg zawiera określone znaki, po prostu użyj String#contains()
.
if (string.contains("-")) {
// Split it.
} else {
throw new IllegalArgumentException("String " + string + " does not contain -");
}
Uwaga: nie przyjmuje wyrażenia regularnego. W tym celu użyj String#matches()
zamiast tego.
Jeśli chcesz zachować podzielony znak w wynikowych częściach, skorzystaj z pozytywnego wyglądu . Jeśli chcesz, aby rozdzielony znak znalazł się po lewej stronie, użyj pozytywnego wyglądu za prefiksem ?<=
grupy na wzorze.
String string = "004-034556";
String[] parts = string.split("(?<=-)");
String part1 = parts[0]; // 004-
String part2 = parts[1]; // 034556
Jeśli chcesz, aby rozdzielony znak znalazł się po prawej stronie, użyj pozytywnego spojrzenia w przód, poprzedzając ?=
grupę wzorem.
String string = "004-034556";
String[] parts = string.split("(?=-)");
String part1 = parts[0]; // 004
String part2 = parts[1]; // -034556
Jeśli chcesz ograniczyć liczbę wynikowych części, możesz podać żądaną liczbę jako drugi argument split()
metody.
String string = "004-034556-42";
String[] parts = string.split("-", 2);
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556-42
reugalr expression
, zwraca tablicę jednego elementu z całym ciągiem znaków.Alternatywą dla bezpośredniego przetwarzania łańcucha byłoby użycie wyrażenia regularnego z grupami przechwytującymi. Ma to tę zaletę, że ułatwia nakładanie bardziej wyrafinowanych ograniczeń na dane wejściowe. Na przykład poniższy ciąg dzieli ciąg na dwie części i zapewnia, że obie składają się tylko z cyfr:
Ponieważ wzorzec jest ustalony w tym przypadku, można go wcześniej skompilować i zapisać jako element statyczny (w przykładzie zainicjowany podczas ładowania klasy). Wyrażenie regularne to:
Nawiasy oznaczają grupy przechwytujące; ciąg pasujący do tej części wyrażenia regularnego można uzyskać za pomocą metody Match.group (), jak pokazano. \ D dopasowuje i pojedyncza cyfra dziesiętna, a + oznacza „dopasuj jedno lub więcej poprzednich wyrażeń). - nie ma specjalnego znaczenia, więc po prostu dopasowuje ten znak na wejściu. Zauważ, że musisz podwójnie uciec z ukośnikami odwrotnymi podczas pisania tego jako ciąg Java. Kilka innych przykładów:
źródło
m.group(1)
drugą częściąm.group(2)
, ponieważm.group(0)
faktycznie zwraca pełny pasujący wzór. Wydaje mi się, że pamiętam też, żegroup(0)
był to pierwszy mecz zamiast pełnego wzorca, może to się zmieniło w ostatniej aktualizacji wersji Java.Spowoduje to podzielenie łańcucha na 2 części. Pierwszym elementem w tablicy będzie część zawierająca elementy przed
-
, a 2. element w tablicy będzie zawierał część łańcucha po-
.Jeśli długość tablicy nie jest 2, a następnie ciąg nie był w formacie:
string-string
.Sprawdź
split()
metodę wString
klasie.źródło
powinien robić, co chcesz. Klasa string ma wiele metod do obsługi ciągu.
źródło
źródło
StringTokenizer
jest klasą starszą, która jest zachowywana ze względu na kompatybilność, chociaż jej użycie jest odradzane w nowym kodzie . Zaleca się, aby każdy, kto szuka tej funkcjonalności, używałsplit
metodyString
lubjava.util.regex
pakietu”.W Javie 8:
źródło
.map(String::trim)
posplit
Wymagania pozostawiły pole do interpretacji. Polecam napisać metodę,
które zawierają tę funkcję. Oczywiście możesz użyć String.split (..), jak wspomniano w innych odpowiedziach dotyczących implementacji.
Powinieneś napisać kilka testów jednostkowych dla łańcuchów wejściowych oraz pożądanych wyników i zachowania.
Dobrzy kandydaci do testu powinni obejmować:
Definiując odpowiednie wyniki testu, możesz określić zachowanie.
Na przykład, jeśli
"-333"
powinien wrócić[,333]
lub jeśli jest to błąd. Czy można"333-333-33"
je rozdzielić,[333,333-33] or [333-333,33]
czy jest to błąd? I tak dalej.źródło
Możesz także spróbować w ten sposób
źródło
Przy założeniu, że
Najprostszym sposobem jest użycie StringUtils # split (java.lang.String, char) . Jest to wygodniejsze niż ten dostarczany przez Javę od razu po wyjęciu z pudełka, jeśli nie potrzebujesz wyrażeń regularnych. Zgodnie z instrukcją, działa on tak:
Poleciłbym używanie commong-lang, ponieważ zwykle zawiera wiele użytecznych rzeczy. Jeśli jednak nie potrzebujesz tego do niczego innego niż dzielenie, lepszym rozwiązaniem jest wdrożenie siebie lub uniknięcie wyrażenia regularnego.
źródło
Użyj metody podziału org.apache.commons.lang.StringUtils, która może dzielić ciągi znaków na podstawie znaku lub ciągu, który chcesz podzielić.
Podpis metody:
W twoim przypadku chcesz podzielić ciąg, gdy występuje „-”.
Możesz po prostu wykonać następujące czynności:
Wynik:
Załóżmy, że jeśli
-
nie istnieje w ciągu, zwraca podany ciąg i nie otrzymasz żadnego wyjątku.źródło
Podsumowując: istnieje co najmniej pięć sposobów podziału łańcucha w Javie:
String.split ():
Pattern.compile (regexp) .splitAsStream (wejście):
StringTokenizer (starsza klasa):
Google Guava Splitter:
Apache Commons StringUtils:
Możesz więc wybrać najlepszą dla siebie opcję w zależności od tego, czego potrzebujesz, np. Typ zwrotu (tablica, lista lub iterowalne).
Oto duży przegląd tych metod i najczęstszych przykładów (jak podzielić przez kropkę, ukośnik, znak zapytania itp.)
źródło
Najszybszym sposobem, który zużywa również najmniej zasobów, może być:
źródło
string1 = s.substring(0, s.indexOf("-"));
string2 = s.substring(s.indexOf("-") + 1);
to. OtrzymaszStringIndexOutOfBoundsException
automatycznie, jeśli nie było „-”.Podział ciągów z wieloma znakami przy użyciu Regex
Wynik:
Ale nie oczekuj tego samego wyniku we wszystkich wersjach JDK. Widziałem jeden błąd występujący w niektórych wersjach JDK, w których pierwszy ciąg zerowy został zignorowany. Ten błąd nie występuje w najnowszej wersji JDK, ale występuje w niektórych wersjach między późnymi wersjami JDK 1.7 a wczesnymi wersjami 1.8.
źródło
W przypadku prostych zastosowań
String.split()
należy wykonać zadanie. Jeśli używasz guawy, istnieje również klasa Splitter, która umożliwia tworzenie łańcuchów różnych operacji na łańcuchach i obsługuje CharMatcher :źródło
źródło
Możesz podzielić ciąg przez podział wiersza, używając następującej instrukcji:
Możesz podzielić ciąg według łącznika / znaku, używając następującej instrukcji:
źródło
źródło
Możesz użyć Split ():
W przeciwnym razie możesz użyć StringTokenizer:
źródło
Są tylko dwie metody, które naprawdę musisz wziąć pod uwagę.
Użyj String.split dla separatora jednoznakowego lub nie zależy ci na wydajności
Jeśli wydajność nie stanowi problemu lub jeśli separator jest pojedynczym znakiem, który nie jest znakiem specjalnym wyrażenia regularnego (tzn. Nie jest jednym z
.$|()[{^?*+\
), możesz użyćString.split
.Metoda podziału ma optymalizację, aby uniknąć używania wyrażenia regularnego, jeśli ogranicznik jest pojedynczym znakiem i nie znajduje się na powyższej liście. W przeciwnym razie musi skompilować wyrażenie regularne, co nie jest idealne.
Użyj Pattern.split i prekompiluj wzorzec, jeśli używasz złożonego ogranicznika i zależy Ci na wydajności.
Jeśli wydajność stanowi problem, a separator nie jest jednym z powyższych, należy wstępnie skompilować wzorzec wyrażeń regularnych, który można następnie wykorzystać ponownie.
Ta ostatnia opcja wciąż tworzy nowy
Matcher
obiekt. Możesz także buforować ten obiekt i resetować go dla każdego wejścia, aby uzyskać maksymalną wydajność, ale jest to nieco bardziej skomplikowane i nie jest bezpieczne dla wątków.źródło
Jednym ze sposobów na to jest uruchomienie ciągu w pętli dla każdego z nich i użycie wymaganego znaku podziału.
Wynik:
źródło
Nie używaj klasy StringTokenizer, ponieważ jest to starsza klasa, która jest zachowywana ze względu na kompatybilność, a jej użycie jest odradzane w nowym kodzie. Możemy również skorzystać z metody podziału, jak sugerują inni.
I zgodnie z oczekiwaniami wydrukuje:
W tej odpowiedzi chcę również wskazać jedną zmianę, która miała miejsce w przypadku
split
metody w Javie 8 . Wykorzystuje metodę String # split ()Pattern.split
, a teraz usunie puste ciągi na początku tablicy wyników. Zwróć uwagę na tę zmianę w dokumentacji Java 8:Oznacza to w poniższym przykładzie:
otrzymamy trzy ciągi:
[0, 0, 4]
a nie cztery, jak miało to miejsce w Javie 7 i wcześniejszych. Sprawdź także to podobne pytanie .źródło
Oto dwa sposoby, aby to osiągnąć.
SPOSÓB 1: Ponieważ musisz podzielić dwie liczby na znak specjalny, możesz użyć wyrażenia regularnego
SPOSÓB 2: Korzystanie z metody podziału ciągu
źródło
Możesz po prostu użyć StringTokenizer, aby podzielić ciąg na dwie lub więcej części, niezależnie od tego, czy istnieją jakiekolwiek typy ograniczników:
źródło
Sprawdź
split()
metodę wString
klasie na javadoc.Oto wiele przykładów podzielonego łańcucha, ale mało zoptymalizowałem kod.
źródło
-
się|
i zobaczyć, co się dzieje :)źródło
Chciałem tylko napisać algorytm zamiast używać wbudowanych funkcji Java:
źródło
Możesz użyć metody
split
:źródło
Aby podzielić ciąg, używa String.split (regex). Przejrzyj następujące przykłady:
Wynik
Uwaga:
Ten podział (regex) przyjmuje regex jako argument. Pamiętaj, aby uniknąć znaków specjalnych wyrażenia regularnego, takich jak kropka / kropka.
źródło
źródło
Aby podzielić ciąg, użyj
String.split(regex)
:Wynik:
źródło