Wyrażenia regularne

0

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 ^ .

0
String [] tab = mojString.split("\^");

Sprobuj tak.

0

Albo użyj java.util.StringTokenizer

0

Pierwsza podpowiedź była bliżej prawdy. Wyrażenie powinno wyglądać tak:

split("\\^")

Dzięki!

0

Ja Was proszę...
PO CO używać całego silnika Regexa do dzielenia po znaku?
Użyj zwykłego explode (czy jak to się tam w Javie nazywa) - jest kilkudziesięciokrotnie szybszy

0

W javie to sie chyba nazywa String.split(). Problem jest taki tylko ze ta metoda wewnetrznie tworzy regexa ;d

0

@Marooned

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?

0

No w PHP jest explode() do dzielenia stringow po delimiterach.

0

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.

0
::. napisał(a)

No w PHP jest explode() do dzielenia stringow po delimiterach.

Tak...szybko pisałem przedostatniego posta i sam się zatwierdził zanim go skończyłem.

0

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

0

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.

0
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.
0
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.

0

Wtedy można wszystkie Stringi jednym Patternem podzielić.

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