Witam, mam krótkie pytanie. Muszę podzielić łańcuch, który wygląda np. tak: 123adshgjas , w miejscach gdzie występują znaki . Wiem, że trzeba wystarczy użyć metody split(), pytanie jak zbudować wyrażenie regularne, które rozpoznaje znak ^ .
- Rejestracja:około 16 lat
- Ostatnio:około rok
- Postów:1398
String [] tab = mojString.split("\^");
Sprobuj tak.

- Rejestracja:ponad 17 lat
- Ostatnio:ponad 2 lata
Co masz na myśli pisząc expolde? Tak chciałeś zaświecić i coś tam z PHP sobie przypomniałeś czy faktycznie coś miałeś na myśli w Javie?
a przykładzik z tokenem (czy jak to się odmienia) :
String data = "php,to,nie,java";
StringTokenizer tokens = new StringTokenizer(data, ",");
while (tokens.hasMoreElements()) {
System.out.println(tokens.nextElement());
}
Oczywiście jak z "" to \
Ale z mojego skromnego dośw token sie przydaje w socketach etc a tak to split jest ok
A czy jest wolniejszy ... O ile wolniejszy?

- Rejestracja:ponad 22 lata
- Ostatnio:około 9 godzin
- Lokalizacja:Poznań
W PHP są do tego dwie funkcje:
explode - dzieli po stringu
split/preg_split - dzieli po regexie
Ta pierwsza jest znacznie szybsza, zwykłe operacje na łańcuchach zamiast odpalania silnika wyrażeń regularnych - a skoro jest potrzeba dzielenia po jednym znaku, to wydaje się logiczne użycie szybszej funkcji.
Wybaczcie, że wtrącam się w język, w którym biegły nie jestem, ale mniemam, iż tak potężna Java również ma dwie funkcje do dzielenia.

- Rejestracja:ponad 17 lat
- Ostatnio:ponad 2 lata
Z tym explode() mnie rozwaliliście.
Ok wg mnie nie ma szybszego spodobu na rozbicie niż poniższy:
String data = "123^45^7";
//znak 94 w kodzie Ascii odpowiadajacy "^"
String ASCII94 = new Character((char) 94).toString();
String[] podzielone = null;
int ktory = 0;
for (int i = 0; i < data.length() - 1; i++) {
if (!data.substring(i, i + 1).equals(ASCII94)) {
podzielone[ktory] = podzielone[ktory] + data.substring(i, i + 1);
} else {
ktory++;
}
}
Nie mam teraz źródłem Javy ale myśle że tam to jest tak samo rozwiązane - taki split na szyko:-)
pozdro
lipkerson napisał(a)
Ok wg mnie nie ma szybszego spodobu na rozbicie niż poniższy:
String data = "123^45^7";
//znak 94 w kodzie Ascii odpowiadajacy "^"
String ASCII94 = new Character((char) 94).toString();
String[] podzielone = null;
int ktory = 0;
for (int i = 0; i < data.length() - 1; i++) {
if (!data.substring(i, i + 1).equals(ASCII94)) {
podzielone[ktory] = podzielone[ktory] + data.substring(i, i + 1);
} else {
ktory++;
}
}
A ja bym powiedzial, ze da sie to jeszcze poprawic (chociazby tak, zeby nie zwracalo NPE ;) ). Pytanie, czy zastapienie jednej linijki kodu kilkunastoma bedzie tego warte? (KISS - Keep It Simple Stupid)
> ##### ::. napisał(a)
> O ile mi wiadomo, a przynajmniej sobie teraz nie przypominam, w "tak poteznym jezyku jak Java" nie ma innej funkcji niz split ktora uzywa regexow.
Zalezy jak na to patrzec. <b>String.split("regex")</b> to tak naprawde <b>Pattern.compile("regex").split(this)</b>, ktore robi Pattern/Matcher behind-the-scenes.
ws napisał(a)
::. napisał(a)
O ile mi wiadomo, a przynajmniej sobie teraz nie przypominam, w "tak poteznym jezyku jak Java" nie ma innej funkcji niz split ktora uzywa regexow.
Zalezy jak na to patrzec. String.split("regex") to tak naprawde Pattern.compile("regex").split(this), ktore robi Pattern/Matcher behind-the-scenes.
No przeciez to wyzej napisalem - ze w srosdku jest niejawny regex. A teraz jaki to ma duzy minus - jesli np wczytujesz linijka po linijce z pliku, linijek sa tysiace, i kazda chcesz splitowac tak samo, to ten sam wewnetrzny regex jest kompilowany tysiace razy, dla kazdej z linijek.
Zazwyczaj jednak sie tym nie przejmuje, wazne ze wiem ze tak jst i jakby co to sie zaradzi.
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.