2009-09-26 10 views
34

Z tego co rozumiem, kropka odwrotna (\.) oznacza jedną literę dowolnej postaci? A więc, ponieważ ukośnik odwrotny jest ucieczką, powinien to być ukośnik odwrotny ukośnik ukośny ("\\.")Jawne wyrażenie regularne value.split ("\."), "Back slash dot" dzieli według znaku?

Co to robi z ciągiem znaków? Właśnie widziałem to w istniejącym kodzie, nad którym pracuję. Z tego co rozumiem, podzieli ciąg na pojedyncze znaki. Dlaczego to zrobić zamiast String.toCharArray(). Czyli dzieli ten ciąg na tablicę ciągów, która zawiera tylko jeden znak dla każdego łańcucha w tablicy?

Odpowiedz

68

Domyślam się, że brakuje ci tych znaków ukośnika odwrotnego ("\") to znaki escape w literałach napisowych Java. Więc kiedy chcesz użyć ucieczki '\' w regex napisanym jako String Java, musisz uciec; na przykład

Pattern.compile("\."); // Java syntax error 

// A regex that matches a (any) character 
Pattern.compile("."); 

// A regex that matches a literal '.' character 
Pattern.compile("\\."); 

// A regex that matches a literal '\' followed by one character 
Pattern.compile("\\\\."); 

Sposób String.split(String separatorRegex) dzieli ciąg do podciągów rozdzielonych dopasowanymi regex podciągów. Tak więc str.split("\\.") podzieli str na podciągi oddzielone pojedynczym literałem "." postać.

+0

:: Działa dobrze.! Ale czy mógłbyś opracować więcej na ten temat, na przykład dlaczego cztery odwrotne ukośniki? Czy nie powinno być trzech? – Oliver

+2

Dosłowny ukośnik odwrotny musi być uniknięty raz w regex. To daje 2. Te 2 odwrotne ukośniki muszą zostać zmienione w literał łańcuchowy. To sprawia, że ​​4. Trzy backslasy dają błąd kompilacji Java. Spróbuj i przekonaj się sam. –

+0

Dlaczego Pattern.compile ("\."); wywołać błąd składni? – adub3

7

Wyliczenie "." dopasowałaby dowolną postać, tak jak ją określasz. Jednak zmieniona kropka "\." pasowałoby do literalnych znaków kropkowych. Tak więc 192.168.1.1 podzielone na "\." spowodowałoby {"192", "168", "1", "1"}.

Twoje sformułowanie nie jest całkowicie jasne, ale myślę, że o to właśnie pytasz.