Java Regexp: UNGREEDY bayrağı

4 Cevap java

Ben genel bir metin işleme aracı liman istiyorum, Texy!, PHP Java.

This tool does ungreedy matching everywhere, using preg_match_all("/.../U"). So I am looking for a library, which has some UNGREEDY flag.

I know I .*? sözdizimi kullanabilirsiniz, ama ben üzerine yazmak zorunda kalacak, gerçekten çok düzenli ifadeler vardır, ve her güncellenmiş sürümü ile onları kontrol edin.

Ben kontrol ettim

  • ORO - terkedilmiş gibi görünüyor
  • Cakarta Regexp - hiç destek
  • java.util.regex - herhangi bir destek

Böyle bir kütüphane var mı?

Teşekkürler, Ondra

4 Cevap

Ben kendi değiştirilmiş Java kütüphanesi oluşturmak öneririz. Sadece kendi paketinin içine java.util.regex kaynağını kopyalayın.

Sun JDK 1.6 Pattern.java sınıfı, bu varsayılan bayrak sunar:

static final int GREEDY     = 0;

static final int LAZY       = 1;

static final int POSSESSIVE = 2;

Bu bayraklar yalnızca birkaç kez kullanıldığını fark edeceksiniz, ve değiştirmek için önemsiz olacaktır. Aşağıdaki örneği ele alalım:

    case '*':
        ch = next();
        if (ch == '?') {
            next();
            return new Curly(prev, 0, MAX_REPS, LAZY);
        } else if (ch == '+') {
            next();
            return new Curly(prev, 0, MAX_REPS, POSSESSIVE);
        }
        return new Curly(prev, 0, MAX_REPS, GREEDY);

Bunun yerine AÇGÖZLÜ bayrak 'tembel' bayrağını kullanmak için son satırı değiştirin. Senin PHP bir gibi davranmaya bir regex kütüphanesini isteyen yana, bu gitmek için en iyi yol olabilir.

Update: dokümanlar kontrol ettikten sonra, açgözlü olmayan için başka bir terimdir LAZY bayrağı bulundu. Sadece OpenJDK mevcut görünmektedir Ancak

p = Pattern.compile("your regex here", LAZY);
p.matcher("string to match")

Original deprecated response I honestly don't think there's one.

+ Bütün mesele? ve *? Eğer açgözlülükle ve hangilerinin tembel yapmak için yapmak için hangi bölümleri seçebilirsiniz yani.

Bu en yaygın düzenli ifadelerde + ve * kullanımı çünkü açgözlü varsayılan davranıştır. Aslında ben bunu çevresinde başka bir yol yok, tek bir regex çözümleyici düşünemiyorum. Bir değiştirici açgözlü bir şey yapmak için kullanılan ve varsayılan tembel eşleşen olduğunu nerede gibi.

Ben o iş yapmak mümkün olacak düşünüyorum tek yolu eklemek için, bu aradığınız cevap değil biliyorum ama? Lütfen * 's ve +' s. Baş üzerinde olanları değiştirilmesi gerekir belirlemek için düzenli ifadeleri kullanabilirsiniz. Hepsi değiştirilmesi gerekiyorsa ve hatta sizin için değişiklik yapmak. Yoksa değişmesi gereken hangi tanımlayan bir desen tanımlayabilirsiniz eğer.

Tüm düzenli ifadeler kontrol ve tekrar kontrol fikri hakkında, php ve java kütüphaneleri zaten bunu yapmak zorunda olmazdı sözdizimi yeterli kabul emin misin? Ne kadar ön yapardım hepsini geçmesi ve bazı testler (giriş ve çıkış) yazmak ve her ikisi de uygulamalarında aynı çalıştığından emin olun. Sonra bunları otomatik olarak çalıştırmak için bir yol bulmak ve gelecekteki yükseltmeleri ve uyumsuzluklar için ele alınacaktır. Sen hala bir şeyler oynamak gerekir, ama en azından nereye bileceksiniz.

Sen 'com.caucho.quercus.lib.regexp.JavaRegexpModule' kullanmak mümkün olabilir. Quercus is a Java implementation of PHP, ve regex kütüphane PHP regex uygulayan syntax and method names.