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 !!
matches
herhangi bir oluşumunu aramayı bekliyorsanız , hepsiyle [a-z]
eşleşmeli mi? matches
Her 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 Matcher
ve .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_search
ve regex_match
. Python'da, re.match
eş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.matches
dizenin 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 dkoe
yalnı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);
}
}
matches
herhangi 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.