2011-12-22 17 views
7

Olumsuz bir ifade var. String.matches dönerJava'da düzenli ifadelerin nasıl reddedileceği

/(.{0,4}) 

aşağıdaki

"/1234" true 
"/12" true 
"/" true 
"" false 
"1234" false 
"/12345" false 

sonuç böylece yukarıda (RegX sadece kullanılarak) ortadan kaldırmak için bir yol var:

"/1234" false 
"/12" false 
"/" false 
"" true 
"1234" true 
"/12345" true 

I' Bütün regex'i yeniden yazmadan herhangi bir regx için çalışacak genel bir çözüm arıyorum.

Aşağıdakileri kullanarak (?! Deseni) aşağıdaki How to negate the whole regex?'a baktım, ancak bu benim için çalışmıyor gibi görünüyor.

aşağıdaki RegX

(?!/(.{0,4})) 

aşağıdaki döndürür: ne istiyorum değil

"/1234" false 
"/12" false 
"/" false 
"" true 
"1234" false 
"/12345" false 

. Herhangi bir yardım mutluluk duyacaktır.

+4

Eşleşip eşleşmediğini eşleştirip eşleştiremediniz mi? Bu regex yeniden yazma ile herhangi bir regex için genel amaçlı bir çözümdür. –

+2

Bu eşleşen kodlama, başka şeyleri kırmadan değiştirilemeyen mevcut bir çerçevenin parçasıdır. – Wayne

cevap

22

Çapalar eklemeniz gerekir. Orijinal regex (eksi gereksiz parantez):

/.{0,4} 

... dört karakter sıfıra ardından bir bölü bir dizeyle eşleşir. Eğer matches() yöntemi kullanarak çünkü gerçekten sanki Ama, otomatik olarak, çapalanmış:

^/.{0,4}$ 

bunun tersini ulaşmak için, otomatik demirleme güvenemez; En azından sondaki ankrajı göz önünde bulundurmalısınız. Ayrıca "ped" Bütün dize tüketmek için regex'i gerektiren bir .*matches() çünkü ile regex vardır:

(?!/.{0,4}$).* 

Ama açıkça, bütün regex demirlemek şöyle önerilir:

^(?!/.{0,4}$).*$ 

Zarar vermez ve özellikle Perl veya JavaScript gibi diğer tatlardan gelen terimleri öğrenen kişiler için niyetinizi tamamen açık hale getirir. matches() yönteminin otomatik olarak sabitlenmesi oldukça sıra dışıdır.

+0

Bu herhangi bir regex için çalışacak mı? ''string negateRegex (String regex) {return" (?! "+ regex +" $). * "; } 'beklendiği gibi çalışır? Bu kendini yok edebilir mi? yani, negateRegex (negateRegex (regex)) 'işlevsel olarak" regex "ile aynı olur mu? – Mark

+0

Hmm, burada bazı ön testler yaptım [1] ve denediğim tüm durumlarda, bir olumsuzluğu reddetmek de dahil olmak üzere çalışıyor gibi görünüyor. [1] http://www.regexplanet.com/advanced/java/index.html – Mark

+0

Regex gibi dizeleri değiştirebileceğine inanmıyorum. \ Q ve \ E'yi düşünüyor musunuz? Sonunda ters eğik çizgi düşünür müsün? – ntysdd

İlgili konular