2008-09-04 25 views
16

Bir alt dizeyle başlayan ve belirli bir alt dizeyle bitmeyen bir dizeyle eşleşen bir regex arıyorum.Belirli bir alt dizgi olmayan bir öğeyle eşleşecek şekilde regex

Örnek:

// Updated to be correct, thanks @Apocalisp 
^foo.*(?<!bar)$ 

"foo" ile başlar ve "bar" ile bitmiyor şey maç mı. [^ ...] sözdizimini biliyorum, ancak bunu tek karakter yerine bir dize için yapacak hiçbir şey bulamıyorum.

Özellikle Java'nın regex'i için bunu yapmaya çalışıyorum, ama daha önce buna koştum, böylece diğer regex motorları için cevaplar da harika olurdu.

Bunun C# 'da çalıştığını doğrulamak için @Kibbee'ye teşekkürler.

+0

aşağıda belirtildiği gibi - Regexp'i giriş dizesi için söz konusu "foo123bar" Bu maç olacak "foo12" - umarım bu istenen davranıştır. – Dmitry

cevap

9

second_string tarafından takip edilemiyor:

foo.*(?<!bar) 
1

Java regex'le aşina değilim, ancak Pattern Class belgelerinin, yakalamayan sıfır genişlikli bir negatif görünüm için (?! X) kullanabileceğinizi öneririm (o, bu bölümdeki X olmayan bir şeyi arar) bir geri çekilme olarak yakalamadan). Yani yapabilirdi:

foo.*(?!bar) // not correct 

Güncelleme: Apocalisp haklı, sen Negatif Geriye İlerleme istiyorum. (*. eşleşmelerin çubukla bitmediğini kontrol ediyorsunuz)

+0

Bu çözümle ilgili sorun, "foo123bar" giriş dizgisinin "foo12" ile eşleşmesidir - umarım bu istenen davranıştır. – Dmitry

0

Diğer yorumcularda da belirtildiği üzere, olumsuz bir bakışa ihtiyacınız var. Bu dize z \

  • first_string ile başlar sağlar - - araçları - sağlamaktadır o dize
  • second_string ile biter

    "^first_string(?!.?second_string)\\z" 
    
    • ^(second_string?!.?): Java'da bu deseni kullanabilirsiniz o first_string bunu gibi örnek olarak geriye dönük negatif istiyorum ben bu durumda düşünüyorum
  • 1

    Doğrulanmış @ Apocalisp cevabı kullanılarak:

    import java.util.regex.Pattern; 
    public class Test { 
        public static void main(String[] args) { 
        Pattern p = Pattern.compile("^foo.*(?<!bar)$"); 
        System.out.println(p.matcher("foobar").matches()); 
        System.out.println(p.matcher("fooBLAHbar").matches()); 
        System.out.println(p.matcher("1foo").matches()); 
        System.out.println(p.matcher("fooBLAH-ar").matches()); 
        System.out.println(p.matcher("foo").matches()); 
        System.out.println(p.matcher("foobaz").matches()); 
        } 
    } 
    

    Bu çıkış doğru cevaplar:

    false 
    false 
    false 
    true 
    true 
    true 
    
    İlgili konular