Java RegEx meta karakteri (.) Ve sıradan nokta?


150

Java RegEx'te, .herhangi bir cümlede kullandığımız gibi meta karakter ve normal nokta (nokta) arasındaki farkın nasıl bulunacağı . Çok gibi diğer meta karakterler için de bu gibi durumlarla nasıl baş edilir ( *, +, \d, ...)

Yanıtlar:


276

Normal ifadelerde nokta veya diğer karakterlerin özel bir anlamı olan normal bir karakter olmasını istiyorsanız, ters eğik çizgi ile bu karakterden kaçmanız gerekir. Java'daki normal ifadeler normal Java dizeleri olduğundan, ters eğik çizginin kendisinden kaçmanız gerekir, bu nedenle iki ters eğik çizgiye ihtiyacınız vardır;\\.


1
bu düzeltme bash
krivar

18
Ters eğik çizgiden kaçınmanın düzenli ifadeyi nasıl sağladığınıza bağlı olduğunu unutmayın. eğer kodlanmışsa kullanmanız gerekir: "\\." , ham bir kaynaktan (örn. metin dosyası) okurken yalnızca tek bir ters eğik çizgi kullanırsınız: \.
Paul

25

Diğer üyelerin önerdiği çözümler benim için işe yaramıyor.

Ama bunu buldum:

Java regexp yazma bir noktadan kaçmak için [.]


2
Aynı, \\.benim için iş vermedi: \.yakındı ., öncelenmelidir gerekmez \\.buna olduğuna inandırmıştı \.yerine ., \\\.ve bir hata attı oluşturucu, [.]çalışan tek şeydi.
mithunc

1
@mithunc Bu tuhaf, \\.bir dizgi değişmezinin içinde \., normal ifadenin noktayı herhangi bir karakter eşleştiricisi yerine gerçek bir nokta olarak görmesi için gereken şey budur.
klaar

16

Perl tarzı düzenli ifadeler (Java regex motorunun az çok dayandığı) aşağıdaki karakterlere özel karakterler olarak davranır:

.^$|*+?()[{\karakter sınıfları dışında özel bir anlamı var ,

]^-\karakter sınıfları ( ) içinde özel bir anlamı vardır [...].

Bu nedenle, bağlama göre (veya karakter sınıfları söz konusu olduğunda, bunları yanlış yorumlanamayacakları konumlara yerleştirin) bu (ve yalnızca bu) sembollerden kaçmanız gerekir.

Gereksiz yere diğer karakterlerden kaçmak işe yarayabilir, ancak bazı regex motorları bunu sözdizimi hataları olarak ele alır, örneğin \_.NET'te bir hataya neden olur.

Bazıları yanlış sonuçlara yol açacaktır, örneğin Perl'de \<bir değişmez olarak yorumlanır <, ancak egrep"kelime sınırı" anlamına gelir.

Yazma Yani -?\d+\.\d+\$maça 1.50$, -2.00$vb ve [(){}[\]]parantez / parantez / parantez her türlü eşleşen bir karakter sınıfı için.

Bir kullanıcı giriş dizesini normal ifade için güvenli bir forma dönüştürmeniz gerekiyorsa, kullanın java.util.regex.Pattern.quote.

Diğer yazılar: Jan Goyvaert'in kaçan metakarakterlerle ilgili RegexGuru blogu


4

Ters eğik çizgi ile özel karakterlerden kaçın. \., \*, \+, \\d, Ve bu kadar. Emin değilseniz, özel olsun ya da olmasın alfabetik olmayan herhangi bir karakterden kaçabilirsiniz. Daha fazla bilgi için java.util.regex.Pattern için javadoc'a bakınız .


Özel olmayan karakterlerden kaçmak gereksiz yere bazı dillerde çalışabilir, ancak diğerlerinde başarısız olabilir, bu yüzden alışkanlığa girmemek daha iyidir.
Tim Pietzcker

1
Bu soru özellikle Java ile ilgilidir ve docs.oracle.com/javase/6/docs/api/java/util/regex/… "Bu karakterin alfabetik olup olmadığına bakılmaksızın alfabetik olmayan bir karakterden önce ters eğik çizgi kullanılabilir kaçış yapısının bir parçası. "
Christoffer Hammarström

2

İşte doğrudan yapıştırmayı kopyalayabileceğiniz kod:

String imageName = "picture1.jpg";
String [] imageNameArray = imageName.split("\\.");
for(int i =0; i< imageNameArray.length ; i++)
{
   system.out.println(imageNameArray[i]);
}

Ve yanlışlıkla "." Dan önce veya sonra kalan boşluklar varsa. Bu gibi durumlarda? Bu alanları da düşünmek her zaman en iyi uygulamadır.

String imageName = "picture1  . jpg";
String [] imageNameArray = imageName.split("\\s*.\\s*");
    for(int i =0; i< imageNameArray.length ; i++)
    {
       system.out.println(imageNameArray[i]);
    }

Burada, \\ s * boşlukları dikkate almak ve size sadece gerekli bölünmüş dizeleri vermek için var.


1

Ben ". *" İle biten bir dize eşleştirmek istedim Bunun için aşağıdakileri kullanmak zorunda kaldı:

"^.*\\.\\*$"

Bunu düşünürseniz aptalca: D Heres ne anlama geliyor. Dizenin başlangıcında sıfır veya daha fazla kez herhangi bir karakter ve ardından bir nokta "" olabilir. ardından dizenin sonunda bir yıldız (*) bulunur.

Umarım bu birisi için kullanışlı olur. Fabian'a ters eğik çizgi için teşekkürler.


Sadece kullan "\\.\\*$". Sizin için önemli değilse dizenin başlangıcı için eşleşmeye gerek yoktur.
Ophidian

Evet haklısın. Dürüst olmak gerekirse, bunun için kullanım durumunu hatırlayamıyorum: /
Atspulgs

Gerçekten size yardımcı olmak için değil, mesajınıza bakarken diğerlerine yardımcı olmak için değildi: P
Ophidian

0

Cümlenizin ". " İle bitip bitmediğini kontrol etmek istiyorsanız , deseninizin sonuna [\. \ ] $ Eklemeniz gerekir.


0

JGrasp bazı temel dizi yapıyorum ve bir char [] [] dizi ('.') Kullanmak için tek bir nokta için bir erişimci yöntemi ile bulundu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.