Odpowiedzi:
Jeśli chcesz, aby kropka lub inne znaki o specjalnym znaczeniu w wyrażeniach regularnych były zwykłymi znakami, musisz ująć je ukośnikiem odwrotnym. Ponieważ wyrażenia regularne w Javie są zwykłymi ciągami Java, musisz pominąć sam ukośnik odwrotny, więc potrzebujesz dwóch ukośników odwrotnych, np.\\.
Rozwiązania proponowane przez innych członków nie działają dla mnie.
Ale znalazłem to:
aby uniknąć kropki w wyrażeniu regularnym java, napisz [.]
\\.
nie zadziałało dla mnie: \.
narzekał, że .
nie trzeba uciekać, \\.
sprawił, że pomyślał, że jest \.
zamiast .
, \\\.
a konstruktor rzucił błąd, [.]
była jedyną rzeczą, która działała.
\\.
wewnątrz literału ciągu podaje \.
to, czego potrzebuje wyrażenie regularne, aby kropka była traktowana jako dosłowna kropka zamiast dopasowywania dowolnego znaku.
Wyrażenia regularne w stylu Perla (na których w mniejszym lub większym stopniu opiera się mechanizm wyrażeń regularnych Java) traktują następujące znaki jako znaki specjalne:
.^$|*+?()[{\
mają specjalne znaczenie poza klasami postaci,
]^-\
mają specjalne znaczenie wewnątrz klas znaków ( [...]
).
Musisz więc uciec od tych (i tylko tych) symboli w zależności od kontekstu (lub, w przypadku klas postaci, umieścić je w miejscach, w których nie można ich błędnie zinterpretować).
Niepotrzebne ucieczki przed innymi znakami mogą działać, ale niektóre mechanizmy regex potraktują to jako błędy składniowe, na przykład \_
spowodują błąd w .NET.
Niektóre inne prowadzą do fałszywych wyników, na przykład \<
jest interpretowane jako dosłowne <
w Perlu, ale w egrep
tym oznacza „granica słowa”.
Więc napisz -?\d+\.\d+\$
do meczu 1.50$
, -2.00$
itd., A [(){}[\]]
dla klasy znaków, który pasuje do wszystkich rodzajów wsporników / szelki / nawiasach.
Jeśli chcesz przekształcić ciąg wejściowy użytkownika w postać bezpieczną dla wyrażeń regularnych, użyj java.util.regex.Pattern.quote
.
Dalsza lektura: blog Jana Goyvaerta RegexGuru o ucieczce przed metaznakami
Unikaj znaków specjalnych z ukośnikiem odwrotnym. \.
, \*
, \+
, \\d
, I tak dalej. Jeśli nie masz pewności, możesz pominąć dowolny znak niealfabetyczny, niezależnie od tego, czy jest on specjalny, czy nie. Więcej informacji można znaleźć w javadoc dla java.util.regex.Pattern .
Oto kod, który możesz bezpośrednio skopiować wklej:
String imageName = "picture1.jpg";
String [] imageNameArray = imageName.split("\\.");
for(int i =0; i< imageNameArray.length ; i++)
{
system.out.println(imageNameArray[i]);
}
A co, jeśli przez pomyłkę pozostaną spacje przed lub po „”. w takich sprawach? Zawsze dobrze jest wziąć pod uwagę również te przestrzenie.
String imageName = "picture1 . jpg";
String [] imageNameArray = imageName.split("\\s*.\\s*");
for(int i =0; i< imageNameArray.length ; i++)
{
system.out.println(imageNameArray[i]);
}
Tutaj \\ s * jest po to, aby wziąć pod uwagę spacje i podać tylko wymagane podzielone ciągi.
Chciałem dopasować ciąg kończący się na „. *” W tym celu musiałem użyć następującego:
"^.*\\.\\*$"
Trochę głupie, jeśli się nad tym zastanowić: D Oto, co to znaczy. Na początku łańcucha może znajdować się dowolny znak zero lub więcej razy, po którym następuje kropka "." po którym następuje gwiazdka (*) na końcu ciągu.
Mam nadzieję, że komuś się to przyda. Dzięki za odwrotny ukośnik dla Fabiana.
"\\.\\*$"
. Nie musisz dopasowywać początku łańcucha, jeśli nie ma to dla Ciebie znaczenia.
Jeśli chcesz zakończyć, sprawdź, czy Twoje zdanie kończy się na „. ”, A następnie dodaj [\. \ ] $ Na końcu wzoru.