Bir kelimeyle veya ön ekiyle eşleşen normal ifade


119

Normal ifadeyi bir kelimenin tamamıyla eşleştirmek istiyorum.

Aşağıdaki örnekte ben maç için çalışıyorum sya seasonama eşleşmeleri ne var s, e, a, ove n.

[s|season]

Tüm bir kelimeyle eşleşecek normal bir ifadeyi nasıl yaparım?


4
(season|s)Bunun yerine kullanın . [season]herhangi biriyle eşleşir s, e, a, o, n.
falsetru

Yanıtlar:


137

Köşeli parantezler karakter sınıfına yöneliktir ve aslında herhangi biriyle eşleşmesi için çalışıyoruz: s, |, s(tekrar), e, a, s(tekrar), ove n.

Gruplama için bunun yerine parantez kullanın:

(s|season)

veya yakalamayan grup:

(?:s|season)

Not: Yakalamayan gruplar motora eşleşmeyi saklamasına gerek olmadığını söylerken, diğeri (yakalama grubu yapar). Küçük şeyler için, ya işe yarıyor, ya da 'ağır hizmet' için, eşleşmeye ihtiyacınız olup olmadığını ilk önce görmek isteyebilirsiniz. Yapmazsanız, asla kullanmanız gerekmeyecek bir şeyi depolamak yerine hesaplama için daha fazla bellek ayırmak için yakalama olmayan grubu kullanın.


Evet fark ettim. Yakalamama ihtiyacım olan şeydi. Eşleşmeme seçeneği olduğunu bildiğim için () kullanmanın her zaman eşleşeceğini düşündüm, teşekkür ederim.
NMGod

Bunu yanlış anladın. ?:İçinde aka gruplama non-capturingsadece eşleşti ile ifadeler kullanmak olamayacağını söylüyor $1, $2vb ... Eğer bir ifade eşleşti olmadığını, ne ihtiyaç vardır istiyorum ^.
EverythingRightPlace

@ NMGodA1b2c3d4 Hoş geldiniz! Eşleşmeme veya yakalanmama seçeneğini mi kastediyorsunuz (bir fark var, evet). Bunlardan hiçbiriyle eşleşmek istemiyorsanız , bu durumda (?! ... )insead kullanacaksınız (?!s|season).
Jerry

126

Modelinizi test etmek için bu canlı çevrimiçi örneği kullanın:

görüntü açıklamasını buraya girin

Bu canlı örnekten alınan yukarıdaki ekran görüntüsü: https://regex101.com/r/cU5lC2/1

Komut satırındaki herhangi bir kelimenin tam olarak eşleşmesi.

Ben kullanarak olacak phpsh interaktif kabuk üzerinde Ubuntu 12.10 göstermek için PCRE regex motoru olarak bilinen yöntemle preg_match

Phpsh'yi başlatın, bir değişkene biraz içerik koyun, kelime ile eşleştirin.

el@apollo:~/foo$ phpsh

php> $content1 = 'badger'
php> $content2 = '1234'
php> $content3 = '$%^&'

php> echo preg_match('(\w+)', $content1);
1

php> echo preg_match('(\w+)', $content2);
1

php> echo preg_match('(\w+)', $content3);
0

Preg_match yöntemi değişkenleri analiz etmek PHP dili içinde PCRE motorunu kullandı: $content1, $content2ve $content3ile (\w)+desen.

$ içerik1 ve $ içerik2 en az bir kelime içerir, $ içerik3 içermez.

Kelime ödülleri olmadan komut satırındaki belirli bir kelimeyi eşleştirin

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'unicorn gun';

php> echo preg_match('(dart|fart)', $gun1);
1

php> echo preg_match('(dart|fart)', $gun2);
1

php> echo preg_match('(dart|fart)', $gun3);
1

php> echo preg_match('(dart|fart)', $gun4);
0

Değişkenler gun1ve gun2dizeyi içeren dartveya fartdoğru olan, ancak gun3 içeriyor dartyve hala eşleşiyor, sorun bu. Bir sonraki örneğe bakalım.

Komut satırındaki belirli kelimeleri kelime sınırlarıyla eşleştirin:

Kelime Sınırları zorla eşleştirilebilir \b, bakınız: Kelime sınırının jex.im/regulex adresinden ne yaptığının görsel analizi

Edinilen Görsel Görüntü Regex http://jex.im/regulex ve https://github.com/JexCheng/regulex Örnek:

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'unicorn gun';

php> echo preg_match('(\bdart\b|\bfart\b)', $gun1);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun2);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun3);
0

php> echo preg_match('(\bdart\b|\bfart\b)', $gun4);
0

\bEmin "dart" yapma, bir kelime sınıra sahip eşleşti, ancak "darty" olmadığını iddia eder.


3
olumlu oy verildi çünkü \ b karakterine ihtiyacım vardı ve bunu bilmiyordum!
Nieminen

Neden bu kapsamlı açıklama cevap değil?
dewwwald

1
Çünkü soruyu gönderen kişi gelen ilk cevabı seçti ve daha sonra çok üstün cevabım geldiğinde benimkine geçme zahmetine girmedi. Soruyu soran kişiye, sorunun altındaki yorum aracılığıyla yanıt seçimini buna değiştirmesini isteyebilirsiniz ve bu, bu sayfanın üzerine gelen insanlar için değerini artıracaktır.
Eric Leschinski

1
Örneğinizde "osuruk" kelimesini kullandığınız için oy verdim ... ve \ w +;)
SomethingOn

Kullandığım regexr.com
Applez00800

4

Örnekleri js'de test ediyorum. En basit çözüm - sadece ihtiyacınız olan kelimeyi ekleyin / /:

var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result

Şimdi bu belirli kelimeye sınırları olan ihtiyacınız varsa, başka işaret harflerinin içinde değil. Biz kullanmak b işaretleyici:

var reg = /\bcat\b/
reg.test('acatb');//1 test 
false // result
reg.test('have cat here');//2 test
true // result

Ayrıca js'de nesne-sonuç döndüren exec () yöntemimiz var. Fg'nin sözümüzün yeri / dizini hakkında bilgi almasına yardımcı olur.

var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5

Tüm eşleşen kelimeleri dizge / cümle / metin olarak almamız gerekirse, g değiştiriciyi kullanabiliriz (genel eşleme):

"cat good cat good cat".match(/\bcat\b/g).length
// 3 

Şimdi sonuncusu - belirli bir kelimeye ihtiyacım yok, bazılarına ihtiyacım var. Kullanıyoruz | işareti, seçim anlamına gelir / veya.

"bad dog bad".match(/\bcat|dog\b/g).length
// 1

2

[ ]bir karakter sınıfını tanımlar. Yani orada ayarladığınız her karakter eşleşecek. veya veya [012]eşleşecek ve aynı şekilde davranacak.012[0-2]

İstediğiniz şey, bir veya ifadesini tanımlamak için gruplamalardır. Sorunuz (s|season)için kullanın .

Btw. dikkat etmelisin. Normal regex'teki (veya bir gruplamanın içindeki) meta karakterler, karakter sınıfından farklıdır. Bir karakter sınıfı, bir alt dil gibidir. [$A]sadece eşleşecek $veya Abaşka hiçbir şey olmayacak. Dolar için buradan kaçmak yok.

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.