SORU
12 Kasım 2009, PERŞEMBE


java.açıklama.normal ifade Deseni önemi.() derleme?

Pattern.compile() yöntemin önemi nedir?
Neden Matcher nesne almadan önce düzenli ifade dize derlemek gerekiyor mu?

örneğin :

String regex = "((\\S )\\s*some\\s*";

Pattern pattern = Pattern.compile(regex); // why i need to compile
Matcher matcher = pattern.matcher(text); //

CEVAP
12 Kasım 2009, PERŞEMBE


compile() yöntem hep denir; Desen bir nesne oluşturmak için tek yolu bu. Asıl soru, neden onu aramak gerekiraçıkça? Bir nedeni Eşleştirici nesnesine bir başvuru gerekir. group(int) yakalama gruplarını içeriğini almak gibi yöntemleri kullanabilirsiniz. Nesne Desen geçer \ \ ulaşmanın tek yolu 10 ** yöntemi, nesne, Desen gel nesne almanın tek yolu compile() yöntemi ile. Sonra, matches(), Dize veya Desen derslerinde yinelenen değil aksine find() yöntemi var.

Diğer sebebi aynı Kalıbı tekrar tekrar nesne oluşturma önlemek için. Her zaman Dize düzenli ifade destekli yöntemleri (veya Desen matches() statik yöntem) birini kullanın, yeni bir Desen ve yeni bir Eşleştirici oluşturur. Bu kod parçacığı:

for (String s : myStringList) {
    if ( s.matches("\\d ") ) {
        doSomething();
    }
}

...tam olarak bu eşdeğerdir:

for (String s : myStringList) {
    if ( Pattern.compile("\\d ").matcher(s).matches() ) {
        doSomething();
    }
}

Açıkçası, gereksiz bir sürü iş yapıyor. Aslında, kolayca daha düzenli derleme ve gerçek bir maç yapmak için daha Desen nesne örneğini alabilir. Genelde anlamda bu işin dışında adım çekmek için yapar. O kadar pahalı değiller ama Maçlar önceden de oluşturabilirsiniz:

Pattern p = Pattern.compile("\\d ");
Matcher m = p.matcher("");
for (String s : myStringList) {
    if ( m.reset(s).matches() ) {
        doSomething();
    }
}

Aşina iseniz .NET yukarıdaki diyagram, Java olmadığını merak ediyor olabilirsiniz compile() yöntemi ile ilgilidir .NET RegexOptions.Compiled değiştirici; cevabım hayır. Java Pattern.compile() Bu yöntem sadece eşdeğerdir .NET Düzenli ifade oluşturucu. Zaman Compiled seçeneği belirleyin:

Regex r = new Regex(@"\d ", RegexOptions.Compiled); 

...düzenli doğrudan bayt kodu ÇİL için, bunu çok daha hızlı gerçekleştirmek için izin derler, ama önünüzde önemli bir maliyetle işleme ve bellek kullanımı--yukarıdaki diyagram için steroidler gibi düşün. Java benzeri yoktur; String#matches(String) ile sahne arkasında oluşturulan bir Desen ve açıkça Pattern#compile(String) ile yaratmak arasında bir fark yok.

(EDİT: ben aslında tüm bu " dedi .NET Düzenli ifade nesneleri yanlış önbelleğe alınır. Beri .NET 2.0, otomatik sadece Düzenli bir kurucu çağırmak Regex.Matches() değil gibi statik yöntemler ile doğrudan önbelleğe oluşur. ref)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chaoticmoogle

    Chaoticmoogl

    13 ŞUBAT 2006
  • humanHardDrive

    humanHardDri

    16 Mart 2011
  • Madeon

    Madeon

    31 Ocak 2010