Znak meta Java RegEx (.) I zwykła kropka?


150

W języku Java RegEx, jak znaleźć różnicę między .(kropką) metaznakiem a zwykłą kropką, której używamy w dowolnym zdaniu. Jak obsługiwać tego rodzaju sytuacji dla innych znaków meta zbyt podobne ( *, +, \d, ...)

Odpowiedzi:


276

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


1
ta poprawka dotyczy również bash
krivar

18
Pamiętaj, że to, czy opuścić ukośnik odwrotny, zależy od tego, w jaki sposób podajesz wyrażenie regularne. jeśli jest zakodowany na stałe, musisz użyć: „\\”. , jeśli czytasz z surowego źródła (np. pliku tekstowego), używasz tylko jednego odwrotnego ukośnika: \.
Paul

25

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 [.]


2
To samo, \\.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.
mithunc

1
@mithunc To dziwne, \\.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.
klaar

16

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 egreptym 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


4

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 .


Unikanie znaków innych niż specjalne może niepotrzebnie działać w niektórych językach, ale może zawieść w innych, więc lepiej nie wpadać w ten nawyk.
Tim Pietzcker

1
To pytanie dotyczy jednak w szczególności Javy, a dokument docs.oracle.com/javase/6/docs/api/java/util/regex/… mówi: „Ukośnik odwrotny może być użyty przed znakiem niealfabetycznym, niezależnie od tego, czy jest to znak część konstrukcji bez ucieczki. "
Christoffer Hammarström

2

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.


1

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.


Po prostu użyj "\\.\\*$". Nie musisz dopasowywać początku łańcucha, jeśli nie ma to dla Ciebie znaczenia.
Ophidian

Tak, masz rację. Szczerze mówiąc, nie mogę sobie przypomnieć przypadku użycia tego: /
Atspulgs,

Tak naprawdę nie pomogłem ci, ale pomogłem innym przeglądającym twój post: P
Ophidian

0

Jeśli chcesz zakończyć, sprawdź, czy Twoje zdanie kończy się na „. ”, A następnie dodaj [\. \ ] $ Na końcu wzoru.


0

Robię podstawową tablicę w JGrasp i stwierdziłem, że z metodą akcesora dla tablicy char [] [] do użycia („.”) Do umieszczenia pojedynczej kropki.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.