Normal ifade yalnızca kelimelerin tamamıyla eşleşir


92

Veritabanında depolanan bir sözlükte yer alan büyük / küçük harfe duyarlı olmayan belirli bir içerik bloğundaki tüm kelimeleri bulmak için kullandığım bir normal ifade ifadesine sahibim. İşte kalıbım:

/($word)/i

Sorun şu ki, eğer kullanırsam /(Foo)/io Foodzaman eşleştirilsin. Kelimenin her iki tarafında da boşluk veya kelime sınırı olması gerekir.

İfademi yalnızca Foobir cümlenin başında, ortasında veya sonunda bir kelime olduğunda eşleşecek şekilde nasıl değiştirebilirim ?

Yanıtlar:


126

Kelime sınırlarını kullanın:

/\b($word)\b/i

Veya Sinan Ünür'ün örneğindeki gibi "SPECTER" arıyorsanız:

/(?:\W|^)(\Q$word\E)(?:\W|$)/i

1
Ben de gönderi yayınlarken bu cevabın uzun süreli versiyonunu yazıyordum. :)
ZombieSheep

@RichardSimoes \b(<|>=)\beşleşmiyor>=
alhelal

@RichardSimoes ve \b[-|+][0-9]+\bmaç +10içinde 43E+10. İkisini de istemiyorum.
alhelal

ya eklenmeyen ya da başka bir kelime içermeyen bir kelimeyi aramak istersem. o zaman bu mantık işe yaramaz
Prasanna Sasne

Birisi matematiksel karşılaştırma operatörlerini> = ve <= nasıl elde eder?
AntonSack

52

Herhangi bir kelimeyi tam olarak eşleştirmek için kalıbı kullanırsınız (\w+)

PCRE veya benzeri bir şey kullandığınızı varsayarsak:

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

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

Komut satırındaki herhangi bir kelimenin tam olarak eşleştirilmesi (\w+)

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.

Komut satırındaki bir dizi değişmez kelimeyi şununla eşleştirin: (dart|fart)

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'farty 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

gun1 ve gun2 değişkenleri dart veya osuruk dizesini içerir. gun4 yapmaz. Ancak kelime farteşleşmeleri aramak bir sorun olabilir farty. Bunu düzeltmek için normal ifadede kelime sınırlarını zorlayın.

Komut satırındaki değişmez kelimeleri kelime sınırlarıyla eşleştirin.

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'farty 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

Bu yüzden kelime dışında önceki örnekle aynıdır fartbir ile \bkelime sınırı içeriğinde yok: farty.


am, pm kelimeler değil mi?
minion

Öğleden önce ve öğleden sonrayı kelime olmaya zorlamak istiyorsanız (onlar değil, kısaltmadırlar), sonra normal ifade motorunuz için bir kelime karakteri olarak nokta ekleyin. Sizin için, bir kelime karakteri olarak nokta belirlemişsiniz gibi görünüyor, bu nedenle normal ifade kelimeleri, Avrupa Sözlüğünüzde melez Avrupa sözlüğünüz için öğretilen "kelimenin" standart tanımı için bire bir ve üzerine olmayacaktır. dil (veya bu konuyla ilgili başka bir dil).
Eric Leschinski

8

Kullanımı \bşaşırtıcı sonuçlar verebilir. Bir kelimeyi tanımından neyin ayırdığını bulmak ve bu bilgiyi kalıbına dahil etmek daha iyi olur.

#!/usr/bin/perl

use strict; use warnings;

use re 'debug';

my $str = 'S.P.E.C.T.R.E. (Special Executive for Counter-intelligence,
Terrorism, Revenge and Extortion) is a fictional global terrorist
organisation';

my $word = 'S.P.E.C.T.R.E.';

if ( $str =~ /\b(\Q$word\E)\b/ ) {
    print $1, "\n";
}

Çıktı:

REx "\ b (S \ .P \ .E \ .C \ .T \ .R \ .E \.) \ B" derleniyor
Final programı:
   1: BAĞLI (2)
   2: AÇIK1 (4)
   4: TAM (9)
   9: KAPAT1 (11)
  11: SABİT (12)
  12: SON (0)
0'da bağlantılı "SPECTER" (bağlantılı kontrol edilir) stclass BAĞLI minlen 14
"SP'ye karşı REx" \ b (S \ .P \ .E \ .C \ .T \ .R \ .E \.) \ B "için sv cinsinden maç başlangıcını tahmin etme
.ECTRE (Karşı İstihbarat için Özel Yönetici, "...
0 ... ofsetinde bağlantılı alt "SPECTER" bulundu ...
start_shift: 0 check_at: 0 s: 0 son konum: 1
STCLASS ile çelişmez ...
Tahmin edildi: 0 ofset ile eşleş
REx "\ b (S \ .P \ .E \ .C \ .T \ .R \ .E \.) \ B" ile "SPECTER (Special Exec
Karşı-istihbarat için "...
   0 | 1: BAĞLI (2)
   0 | 2: AÇIK1 (4)
   0 | 4: TAM (9)
  14 | 9: KAPAT1 (11)
  14 | 11: SABİT (12)
                                  başarısız oldu...
Maç başarısız oldu
REx boşaltma: "\ b (S \ .P \ .E \ .C \ .T \ .R \ .E \.) \ B"

1
Bir kelimenin tipik olarak bir kelime olacağını düşünüyorum, ancak ilginç bir nokta.
Richard Simões

1

kelime sınırlarını kullanın \ b,

Aşağıdaki (dört çıkış kullanarak) ortamımda çalışır: Mac, safari Sürüm 10.0.3 (12602.4.8)

var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)

1

Kodlarında bir Enum doğrulamak isteyenler için kılavuzu takip edebilirsiniz

Regex World'de ^bir dizeyi başlatmak ve $bitirmek için kullanabilirsiniz. Bunları birlikte kullanmak |istediğiniz şey olabilir:

^(Male)$|^(Female)$

Yalnızca Maleveya Femaledurum için doğru olarak dönecektir .


^ve $bir satırın başlangıcını (sırasıyla sonu) eşleştirin, bu nedenle, örneğiniz yalnızca satırdaki tek kelimelerse eşleşir .
2020

ve bir numaralandırmayı doğrulamak istediğimde tam olarak istediğim şey bu! sorun nedir?
MohamadrezaRahimianGolkhandani

0

Notepad ++ ile yapıyorsanız

[\w]+ 

Size tüm kelimeyi verir ve bir grup olarak almak için parantez ekleyebilirsiniz. Örnek: conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs). Hareket etmek istiyorum LeakyReLUyorum olarak kendi hattına ve mevcut aktivasyon değiştirin. Notepad ++ 'da bu, aşağıdaki find komutu kullanılarak yapılabilir:

([\w]+)( = .+)(LeakyReLU.alpha=a.)(.+)

ve değiştirme komutu şu hale gelir:

\1\2'relu'\4 \n    # \1 = LeakyReLU\(alpha=a\)\(\1\)

Boşluklar, kodumda doğru biçimlendirmeyi korumaktır. :)


-1

Bir dizedeki tüm "kelimeleri" toplayın

/([^\s]+)/g

Temelde ^/sboşluk (ya da olmayan alanların maçı gruplarına) üzerine mola anlamına
unutma gAçgözlü için

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.