2015-02-28 19 views
13

Aramadan sonra bu soruyu sormaya karar verdim. Neden bu düzenli ifade: ^(dog).+?(cat)? işe yaradığını düşündüğü gibi çalışmıyor (eğer varsa ilk köpek ve kediyi yakalayın)? Burada neyi özlüyorum?Regex isteğe bağlı yakalama grubu?

dog, cat 
dog, dog, cat 
dog, dog, dog 

cevap

17

Peşinde isteğe bağlı cat alamadım nedeni .+? bu isteğe olmayan demirlemiş hem olmasıdır isteksizce nitelikli: Motor o maç yapmak zorunda değildir, yasal olarak tedavi edebilir çünkü cat, .+? dizisinin "kuyruğu" olarak.

yo dize sonunda kedi, yani ^(dog).+?(cat)?$ kullanmak demirlemek varsa, gerçi bir maç, alacağı:

Pattern p = Pattern.compile("^(dog).+?(cat)?$"); 
for (String s : new String[] {"dog, cat", "dog, dog, cat", "dog, dog, dog"}) { 
    Matcher m = p.matcher(s); 
    if (m.find()) { 
     System.out.println(m.group(1)+" "+m.group(2)); 
    } 
} 

Bu baskılar (demo 1)

dog cat 
dog cat 
dog null 

Do Kedi sonra bir şey olması durumunda onunla nasıl başa çıkacağını biliyor musun?

Bunu, cat dışında bir şey eşleşen bir yanıltıcıdır ifade oluşturarak başa çıkabilirim:

^(dog)(?:[^c]|c[^a]|ca[^t])+(cat)? 

Şimdi cat çapa ( demo 2) olmadan hiçbir yere dizede gerçekleşebilir. dasblinkenlight cevabı @

+3

Teşekkürler. Kediden sonra bir şey olması durumunda nasıl başa çıkacağınızı biliyor musunuz? Örneğin: 'köpek, köpek, kedi, blah'. Sadece ilk köpek ve isteğe bağlı kedi yakalamak istiyorum (en çok bir kedi olabilir). – forsajt

+1

bu cevabı görmeyi çok isterim –

4

harika ama burada o/o

bir şey kedinin sonra çıkması olasılığına karşı, onunla nasıl başa tanıyor musunuz istedi bunun 2 parçasını, geliştiren bir regexp'in var?

Regexp ^(dog)(.+(cat))?, grup no. İsteğe bağlı kedi almak için 2 yerine 3 yerine, ancak char-by-char hilesi olmadan da çalışır.

Ve burada (yine, yine ben, teşekkürler tamircilik ve bu çözüm bulmak için izin @ dasblinkenlight en demo dan çatallı olan!) the demo var

+0

Ayrıca^(köpek) (?:. + (Kedi)) gibi bir yakalama dışı grupla çalışıyor mu? böylece orada fazladan yakalama grubunuz yok –

2

Figha uzantısı biraz daha da uzatılabilir @, yapmamaya gereksiz ikinci yakalama.

?:, sabit olmayan regex öğesinin parçalanmış bir bölümünü oluşturmak için kullanılır. Bu nedenle, normal ifadeler: extended demo ve regex test.