Tüm normal ifade nasıl reddedilir?


97

Örneğin bir normal ifadem var (ma|(t){1}). Eşleşir mave teşleşmez bla.

Ben, regex olumsuzlamak böylece aynı olmalıdır istiyorum bladeğil mave t, bu regex bir şey ekleyerek . Yazabileceğimi biliyorum bla, ancak gerçek normal ifade daha karmaşıktır.


5
Bir kenara, {1}tamamen işe yaramaz. (Bir değer sağladığını düşünüyorsanız, neden yazmıyorsunuz ((m{1}a{1}){1}|(t){1}){1}?)
üçlü

Yanıtlar:


103

Negatif etrafa bakma kullanın: (?!pattern)

Pozitif bakış açıları, bir modelin eşleştiğini iddia etmek için kullanılabilir. Negatif bakış açıları bunun tersidir: bir modelin eşleşmediğini iddia etmek için kullanılır. Bazı lezzetler iddiaları destekler; bazıları geriye bakmaya vb. sınırlamalar koyar.

Düzenli-ifadeler.info'ya bağlantılar

Ayrıca bakınız

Daha fazla örnek

Bunlar, alıştırma olarak oyuncak problemlerine düzenli ifade çözümleri bulma girişimleridir; Lookarounds kullanabileceğiniz çeşitli yolları öğrenmeye çalışıyorsanız (onları iç içe geçirmek, yakalamak için kullanmak vb.) eğitici olmalıdır:


2
düzenli-ifadeler.info, regex ile ilgili her şey için çok iyi bir kaynaktır.
Freiheit

Ne her şeye sahip etrafa bakma desteği? İle çalışmıyor grep.
Lazer

Pattern.compile("(?!(a.*b))").matcher("xab").matches()olmalı true, değil mi?
Karl Richter

4
Bunun doğru olmadığını düşünüyorum, doğru bir alternatif için stackoverflow.com/questions/8610743/… adresini ziyaret edin.
Karl Richter

57

Yalnızca normal ifadeyle tamamen eşleşen dizelere izin vermemek istediğinizi varsayarsak (yani, mmblatamam, ancak mmdeğil), istediğiniz şey budur:

^(?!(?:m{2}|t)$).*$

(?!(?:m{2}|t)$)olumsuz bir bakış açısıdır ; "geçerli konumdan başlayarak, sonraki birkaç karakter veya değildir , ardından dizenin sonu gelir" diyor. Baştaki başlangıç ​​ankrajı ( ), önden ilerlemenin dizenin başlangıcına uygulanmasını sağlar. Bu başarılı olursa, devam eder ve dizeyi tüketir.mmt^.*

Bilginize, Java'nın matches()yöntemini kullanıyorsanız , gerçekten ^ve sonuna ihtiyacınız $yoktur, ancak herhangi bir zarar vermezler. Yine de $, önden bakış gereklidir.


2
Bu cevabın en yararlı kısmı, .*normal ifadenizin sonuna eklemeniz gerektiğidir, aksi takdirde her dizeyi reddeder.
Rav

2
$ İçeride negatif lookahead VE .*sonunda hem kritik parçalarıdır. RE'lerde her zaman olduğu gibi, doğru bir şekilde elde etmek için güçlü bir birim test seti kesinlikle çok önemlidir. Bu cevap% 100 doğrudur.
Tom Dibble

1
\b(?=\w)(?!(ma|(t){1}))\b(\w*)

bu, verilen normal ifade içindir.
\ b kelime sınırını bulmaktır.
pozitif bakış (? = \ w) boşluklardan kaçınmak içindir.
orijinal normal ifadenin üzerine olumsuz bakış, bunun eşleşmelerini önlemektir.
ve son olarak (\ w *) kalan tüm kelimeleri yakalamaktır.
kelimeleri tutacak grup 3. gruptur.
Basit (?! desen) hiçbir alt dizge
basit ^ (?! (?: m {2} | t) $) ile eşleşeceğinden çalışmayacaktır . * $ olacak ayrıntı düzeyi tam satır olduğundan çalışmıyor


0

Laravel kullanıyorsanız bunu uygulayın.

Laravel bir not_regex'e sahiptir, burada doğrulama altındaki alan verilen düzenli ifadeyle eşleşmemelidir; PHP preg_matchişlevini dahili olarak kullanır .

'email' => 'not_regex:/^.+$/i'
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.