Regex: belirli bir kalıptan başka her şeyle eşleşir


310

Ben her şeyi ancak belirli bir desen (özellikle index.phpve ne gibi, aşağıdaki gibi index.php?id=2342343) ile başlayan bir dize maç mümkün regex gerekir


Ve hangi belirli desenle eşleşmek istemiyorsunuz?
Dominic Rodger

2
Deseninizle eşleşememenizin ve dize eşleşirse bir şey yapmamanızın bir nedeni var mı?
Thomas Owens


@ThomasOwens: Değişir. İfadenin hangi kısmının reddedileceğine bağlıdır. Eğer bütün ifade reddedilecekse, o zaman bir fikrin var. Örneğin, "dize bir alt dize olarak 'Bruce' içermiyorsa, o zaman bir şeyler yapın" kodlamak istiyorsanız, açıkça / Bruce / komutunu kullanırsınız ve negatif ifadeyi normal ifadenin dışında if ifadesine koyarsınız. . Ancak bazı alt ifadeleri reddetmek isteyebilirsiniz. Diyelim ki adın soyadı gibi bir ad arıyorsunuz, adın Bruce olduğu ve soyadı XYZ dışında her şeydir, burada XYZ Bruce adında bir ünlünün soyadıdır.
mathheadinclouds

Yanıtlar:


250

Bir regexp uzmanı değil, ama başlangıçtan itibaren negatif bir ileriye bakabileceğinizi düşünüyorum, örneğin ^(?!foo).*$başlangıçtan itibaren hiçbir şeyle eşleşmemelidir foo.


7
Grep ile ileriye bakmak için -P kullanın.
Seppo Enarvi

İstediğiniz davranış "foo" veya "bar" ile
eşleşmiyorsa

15
Bu cevap yanlış, hızlı bir test bunu gösteriyor. Ne demek istediğini düşünüyorum ^((?!foo).)*$( stackoverflow.com/a/406408/3964381 )
gilad mayani

4
Lütfen kullandığınız sembolleri ve neden kullandığınızı açıklar mısınız?
rotimi-en iyi

339

Regex: aşağıdakiler hariç her şeyi eşleştirin :

Demo notu : Yeni satır \n, komşu satırlara eşleşme taşmasını önlemek için demolarda negatif karakter sınıflarında kullanılır. Tek tek dizeleri test ederken gerekli değildir.

Bağlantı notu : Birçok dilde, \Adizenin açık başlangıcını tanımlamak için kullanın ve \z(Python'da, \ZJavaScript'te, $sorun yok) dizenin sonunu tanımlamak için kullanın.

Nokta notu : Birçok aromada (ancak POSIX, TRE, TCL'de değil), .herhangi bir karakterden başka bir karakterle eşleşir . Yeni satır dahil herhangi bir karakterle eşleşmesi için karşılık gelen bir DOTALL değiştirici ( /sPCRE / Boost / .NET / Python / Java ve /mRuby'de) kullandığınızdan emin olun ..

Backslash not : Eğer (gibi çıkış sıralarını sağlayan C dizeleriyle desenleri beyan etmek zorunda dillerde \n, motor (değişmez karakter olarak ele böylece özel karakterleri kaçan ters eğik çizgi ikiye katlama gerekmez bir Yenisatır için) örneğin Java, world\.olacak olarak adlandırılır "world\\."veya bir karakter sınıfı kullanır:) "world[.]". Ham dize değişmez değerleri (Python r'\bworld\b'), C # kelimesi kelimesine dize değişmez değerleri @"world\."veya slashy dizeleri / regex değişmez gösterimlerini kullanın /world\./.


Harika yaz! "Bazı dizelere eşit bir dize (değil)" örneğinde ^(?!foo$), ifadenin çalışması için neden dolar işaretinin parantez içinde olması gerekir? ^(?!foo)$Aynı sonuçları vermeyi bekliyordum ama vermedi.
Grant Humphries

3
@HrantHumphries: $Çapa gözün içinde olduğunda, durumun bir parçası, sıfır genişlikli iddianın bir parçasıdır . Dışında olsaydı, olduğu gibi , dize başlangıcından hemen sonra dize sonu gerektiren tüketim modelinin bir ^(?!foo)$parçası olacak ve negatif geri dönüşü her zaman doğru olacağı için alakasız hale getirecek (dize bittikten sonra herhangi bir metin olamaz) , bırakalım ). Bu nedenle, takip edilmeyen bir dizenin başlangıcını dize bitimiyle eşleştirir . boş bir dizeyle eşleşir. foo^(?!foo$)foo^(?!foo)$
Wiktor Stribiżew

@ robots.txt Lütfen bu yorumları kaldırın. Bir XY sorusu soruyorsun. Karakter sınıfları tek karakterlerle eşleşmelidir, onlarla karakter dizisi tanımlamanın bir yolu yoktur. Muhtemelen bir dizgenin başlangıcı ile cotya da ilk oluşumu arasında alt dizeyi bulmalı lanve eşleşmeyi kaldırmalısınız regex.replace(myString, "^.*?(?:cot|lan)\s*", "").
Wiktor Stribiżew

Sevgili Wiktor. Sorumu kapattınız ancak bağlantılı cevabınız başarısız oldu.
Sorumu

Örneğin, bağlantılı yanıtınız bu örnekte "paketler <! - ve web sayfası <! - asdasasdas -> editörleri artık -> Lorem Ipsum kullanıyor"
MonsterMMORPG

259

^Bir karakter kümesinin başına, bu karakterlerden başka bir şey eşleştirmek için a koyabilirsiniz .

[^=]*

her şeyle eşleşecek ama =


55
Bu doğru, ama her seferinde sadece bir karakter işliyor. İki veya daha fazla karakterden oluşan bir diziyi hariç tutmak istiyorsanız, diğer yanıtlayanların söylediği gibi negatif ileriye bakmanız gerekir.
Alan Moore

mükemmel bir çözüm tu istenmeyen herhangi bir karakter çıkarmak ancak desen bileşiklerdir. teşekkürler
Sirmyself

@Alan, "... negatif bir ileriye bakmanız gerekiyor ..." yanlış, ama sizin için çok zor olmamalıyız, çünkü Wiktor cevabını göndermedi - bu nedenini gösteriyor - 2016'ya kadar.
Cary Swoveland

6

Eşleştirin, /^index\.php/ardından eşleşen her şeyi reddedin.


Belki de yazılmıştır str !~ /\Aindex\.php/.
Cary Swoveland

6

Python'da:

>>> import re
>>> p='^(?!index\.php\?[0-9]+).*$'
>>> s1='index.php?12345'
>>> re.match(p,s1)
>>> s2='index.html?12345'
>>> re.match(p,s2)
<_sre.SRE_Match object at 0xb7d65fa8>

3
"İndex_php" veya "index # php" reddedilir.

1

Regex her şeyi eşleştirmek mümkün ama belirli bir desen (özellikle index.php ve ne takip, index.php? İd = 2342343 gibi) ile başlayan bir dize dışında gerekir index.php

Exec yöntemini kullan

    let match,
        arr = [],
        myRe = /([\s\S]+?)(?:index\.php\?id.+)/g;

    var str = 'http://regular-viragenia/index.php?id=2342343';

    while ((match = myRe.exec(str)) != null) {
         arr.push(match[1]);
    } 
    
    console.log(arr);

var myRe = /([\s\S]+?)(?:index\.php\?id=.+)/g;
var str = 'http://regular-viragenia/index.php?id=2342343';
var matches_array = myRe.exec(str);
console.log(matches_array[1]);

VEYA DİĞER MAÇ

let match,
            arr = [],
            myRe = /index.php\?id=((?:(?!index)[\s\S])*)/g;

        var str = 'http://regular-viragenia/index.php?id=2342343index.php?id=111index.php?id=222';

        while ((match = myRe.exec(str)) != null) {
             arr.push(match[1]);
        } 

        console.log(arr);


-13

Normal ifade kullanmamaya ne dersiniz:

// In PHP
0 !== strpos($string, 'index.php')

11
OP özellikle regex istedi ... Emin değilim! ( grepÖrneğin komut satırında veya Perl / Python / başka bir dilde veya bir metin düzenleyicide "Her satır için bu normal
ifadeyi çalıştır
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.