Persamaan reguler hanya cocok untuk seluruh kata

90

Saya memiliki ekspresi regex yang saya gunakan untuk menemukan semua kata dalam blok konten tertentu, tidak peka huruf besar / kecil, yang terkandung dalam glosarium yang disimpan dalam database. Inilah pola saya:

/($word)/i

Masalahnya adalah, jika saya menggunakan /(Foo)/imaka kata-kata seperti Foodcocok. Harus ada spasi atau batas kata di kedua sisi kata.

Bagaimana cara mengubah ekspresi saya agar hanya cocok dengan kata Fooyang merupakan kata di awal, tengah, atau akhir kalimat?

Aaron
sumber

Jawaban:

121

Gunakan batasan kata:

/\b($word)\b/i

Atau jika Anda menelusuri "SPECTER" seperti di contoh Sinan Ünür:

/(?:\W|^)(\Q$word\E)(?:\W|$)/i
Richard Simões
sumber
1
Saya baru saja mengetik versi panjang dari jawaban ini ketika Anda memposting. :)
ZombieSheep
@RichardSesuatu \b(<|>=)\btidak cocok>=
alhelal
@RichardSimoes dan \b[-|+][0-9]+\bpertandingan +10di 43E+10. Keduanya saya tidak mau.
alhelal
bagaimana jika saya ingin mencari kata yang tidak ditambahkan atau tidak terkandung dalam kata lain. maka logika ini tidak akan berhasil
Prasanna Sasne
Bagaimana seseorang mendapatkan operator perbandingan matematis> = dan <=?
AntonSack
50

Untuk mencocokkan seluruh kata, Anda akan menggunakan polanya (\w+)

Dengan asumsi Anda menggunakan PCRE atau yang serupa:

masukkan deskripsi gambar di sini

Tangkapan layar di atas diambil dari contoh langsung ini: http://regex101.com/r/cU5lC2

Mencocokkan seluruh kata pada baris perintah dengan (\w+)

Saya akan menggunakan shell interaktif phpsh di Ubuntu 12.10 untuk mendemonstrasikan mesin regex PCRE melalui metode yang dikenal sebagai preg_match

Mulai phpsh, masukkan beberapa konten ke dalam variabel, cocokkan dengan kata.

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

Metode preg_match digunakan mesin PCRE dalam bahasa PHP untuk menganalisis variabel: $content1, $content2dan $content3dengan (\w)+pola.

$ content1 dan $ content2 mengandung setidaknya satu kata, $ content3 tidak.

Cocokkan sejumlah kata literal pada baris perintah dengan (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

Variabel gun1 dan gun2 berisi string dart atau fart. gun4 tidak. Namun mungkin masalah mencari kata yang fartcocokfarty . Untuk memperbaikinya, terapkan batas kata dalam regex.

Cocokkan kata literal pada baris perintah dengan batas kata.

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

Jadi itu sama dengan contoh sebelumnya kecuali bahwa kata fartdengan \bbatas kata tidak ada dalam konten: farty.

Eric Leschinski
sumber
am, pm bukan kata-kata?
antek
Jika Anda ingin memaksa am dan pm menjadi kata-kata, (bukan, itu akronim), tambahkan titik sebagai karakter kata untuk mesin regex Anda. Bagi Anda tampaknya Anda telah menetapkan titik sebagai bukan karakter kata, jadi oleh karena itu kata-kata regex tidak akan menjadi satu-ke-satu dan ke dalam untuk definisi standar "kata" yang diajarkan di Kamus Eropa Anda untuk bahasa Eropa campuran Anda bahasa (atau bahasa lain dalam hal ini).
Eric Leschinski
8

Penggunaan \bdapat memberikan hasil yang mengejutkan. Anda akan lebih baik mencari tahu apa yang memisahkan kata dari definisinya dan memasukkan informasi itu ke dalam pola Anda.

#!/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";
}

Keluaran:

Mengompilasi REx "\ b (S \ .P \ .E \ .C \ .T \ .R \ .E \.) \ B"
Program terakhir:
   1: TERIKAT (2)
   2: BUKA1 (4)
   4: PERSIS (9)
   9: TUTUP1 (11)
  11: TERIKAT (12)
  12: SELESAI (0)
berlabuh "SPECTER" di 0 (memeriksa berlabuh) stclass BOUND minlen 14
Menebak awal pertandingan di sv untuk REx "\ b (S \ .P \ .E \ .C \ .T \ .R \ .E \.) \ B" melawan "SP
.ECTRE (Eksekutif Khusus untuk Kontra-intelijen, "...
Ditemukan substr berlabuh "SPECTER" pada offset 0 ...
start_shift: 0 check_at: 0 s: 0 endpos: 1
Tidak bertentangan dengan STCLASS ...
Dugaan: cocok dengan offset 0
Mencocokkan REx "\ b (S \ .P \ .E \ .C \ .T \ .R \ .E \.) \ B" melawan "SPECTER (Special Exec
utive for Counter-intelligence, "...
   0 | 1: TERIKAT (2)
   0 | 2: BUKA1 (4)
   0 | 4: PERSIS (9)
  14 | 9: TUTUP1 (11)
  14 | 11: TERIKAT (12)
                                  gagal...
Pertandingan gagal
Membebaskan REx: "\ b (S \ .P \ .E \ .C \ .T \ .R \ .E \.) \ B"
Sinan Ünür
sumber
1
Saya pikir sebuah kata biasanya akan menjadi kata \ w, tetapi hal yang menarik.
Richard Simões
1

gunakan batasan kata \ b,

Berikut ini (menggunakan empat pelarian) berfungsi di lingkungan saya: Mac, safari Versi 10.0.3 (12602.4.8)

var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)
X. L
sumber
1

Bagi Mereka yang ingin memvalidasi Enum dalam kodenya, Anda dapat mengikuti panduan ini

Di Dunia Regex Anda dapat menggunakan ^untuk memulai string dan $mengakhirinya. Menggunakannya dalam kombinasi dengan |bisa menjadi apa yang Anda inginkan:

^(Male)$|^(Female)$

Ini akan mengembalikan true hanya untuk Maleatau Femalecase.

MohamadrezaRahimianGolkhandani
sumber
^dan $cocok dengan awal (masing-masing akhir) baris, oleh karena itu contoh Anda akan cocok hanya jika itu adalah satu-satunya kata dalam baris.
Tuan
dan inilah yang saya inginkan ketika saya ingin memvalidasi enum! Apa masalahnya?
MohamadrezaRahimianGolkhandani
0

Jika Anda melakukannya di Notepad ++

[\w]+ 

Akan memberi Anda seluruh kata, dan Anda dapat menambahkan tanda kurung untuk mendapatkannya sebagai grup. Contoh: conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs). Saya ingin pindahLeakyReLU ke barisnya sendiri sebagai komentar, dan mengganti aktivasi saat ini. Di notepad ++ ini dapat dilakukan dengan menggunakan perintah follow find:

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

dan perintah ganti menjadi:

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

Spasi digunakan untuk menjaga format yang benar dalam kode saya. :)

JTIM
sumber
-1

Dapatkan semua "kata" dalam sebuah string

/([^\s]+)/g

Pada dasarnya ^/sberarti istirahat pada spasi (atau cocokkan kelompok non-spasi)
Jangan lupa guntuk Greedy

gdibble
sumber