Bu küçük kod parçasına sahibim
String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
if(s.matches("[a-z]"))
{
System.out.println(s);
}
}
Yazdırılması gerekiyordu
dkoe
ama hiçbir şey yazdırmıyor !!
Bu küçük kod parçasına sahibim
String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
if(s.matches("[a-z]"))
{
System.out.println(s);
}
}
Yazdırılması gerekiyordu
dkoe
ama hiçbir şey yazdırmıyor !!
matchesherhangi bir oluşumunu aramayı bekliyorsanız , hepsiyle [a-z]eşleşmeli mi? matchesHer karakteri tek tek normal ifadeyle karşılaştırmayı beklemem .
Yanıtlar:
Java'nın yanlış adlandırılmış .matches()yöntemine hoş geldiniz ... TÜM girdileri dener ve eşleştirir. Ne yazık ki, diğer diller de aynı şeyi yaptı :(
Normal ifadenin bir giriş metniyle eşleşip eşleşmediğini görmek istiyorsanız, a Pattern, a Matcherve .find()eşleştirici yöntemini kullanın :
Pattern p = Pattern.compile("[a-z]");
Matcher m = p.matcher(inputstring);
if (m.find())
// match
İstediğiniz şey gerçekten bir girdinin yalnızca küçük harflere sahip olup olmadığını görmekse, kullanabilirsiniz .matches(), ancak bir veya daha fazla karakteri eşleştirmeniz gerekir: 'deki +gibi karakter sınıfınıza a ekleyin [a-z]+. Veya ^[a-z]+$ve kullanın .find().
.matches(). Bu örnekte neden .find()bu kadar yavaş çalıştığını biliyor musunuz ?
regex_searchve regex_match. Python'da, re.matcheşleşmeyi yalnızca dizenin başlangıcına sabitler ( \Apatternöyleymiş gibi ) ve Python 3.x'in güzel bir .fullmatch()yöntemi vardır. JS, Go, PHP ve .NET'te, eşleşmeyi örtük olarak sabitleyen regex yöntemleri yoktur. ElasticSearch, XML Schema ve HTML5 / Validators Angluar kalıpları her zaman varsayılan olarak sabitlenir. Swift / Objective C'de, modeli başlangıçta bir seçenekle sabitlemenin bir yolu var.
[a-z]a ve z arasındaki tek bir karakterle eşleşir . Yani, "d"örneğin dizeniz sadece olsaydı, eşleşirdi ve yazdırılırdı.
Normal ifadenizi [a-z]+bir veya daha fazla karakterle eşleşecek şekilde değiştirmeniz gerekir .
^ve soneki $sağlanan regexp'in etrafına koyması, istemeden değiştirmesi ve garip hatalar yaratmasıdır. Bunu yapmamalılar çünkü ilk normal ifadenin kastettiği bu değildi.
String.matchesdizenin tamamının herhangi bir alt dizeyle değil, normal ifadeyle eşleşip eşleşmediğini döndürür .
Java'nın normal ifadeler uygulaması tüm dizeyle eşleşmeye çalışır
bu, eşleşen bir bölümü bulmaya çalışan perl normal ifadelerinden farklıdır.
küçük harf karakterlerinden başka hiçbir şey içermeyen bir dize bulmak istiyorsanız, kalıbı kullanın [a-z]+
en az bir küçük harf içeren bir dize bulmak istiyorsanız, kalıbı kullanın .*[a-z].*
Normal ifadeniz [a-z]uymuyor dkoeyalnızca gibi uzunluğu 1. Kullanım şeyin Dizeleri maçları beri [a-z]+.
Eşleşmek ()için desene en azından bir yakalama koymalı ve aşağıdaki gibi düzeltmelisiniz:
String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
if(s.matches("(^[a-z]+$)"))
{
System.out.println(s);
}
}
matchesherhangi bir çıktısı yoktur.
Aşağıdakileri yaparak deseninizin büyük / küçük harf duyarlı olmasını sağlayabilirsiniz:
Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);
matches, sizin için normal ifadelerin başına ^ ve sonuna $ koyar. Yanimatches("[a-z]")aslında / ^ [az] $ / arayacak.