Persamaan reguler untuk mencocokkan kata atau awalannya

119

Saya ingin mencocokkan ekspresi reguler di seluruh kata.

Pada contoh berikut saya mencoba untuk mencocokkan satau seasontapi apa yang saya miliki pertandingan s, e, a, odan n.

[s|season]

Bagaimana cara membuat ekspresi reguler agar cocok dengan seluruh kata?

NMGod
sumber
4
Gunakan (season|s)sebagai gantinya. [season]cocok salah s, e, a, o, n.
falsetru

Jawaban:

137

Kurung dimaksudkan untuk kelas karakter, dan Anda benar-benar mencoba untuk mencocokkan salah satu dari: s, |, s(lagi), e, a, s(lagi), odan n.

Gunakan tanda kurung sebagai gantinya untuk pengelompokan:

(s|season)

atau grup non-penangkap:

(?:s|season)

Catatan: Grup non-tangkap memberi tahu mesin bahwa itu tidak perlu menyimpan pertandingan, sementara yang lain (grup penangkap perlu). Untuk barang kecil, entah berfungsi, untuk barang 'tugas berat', Anda mungkin ingin melihat dulu apakah Anda membutuhkan korek api atau tidak. Jika tidak, lebih baik gunakan grup non-capture untuk mengalokasikan lebih banyak memori untuk kalkulasi daripada menyimpan sesuatu yang tidak perlu Anda gunakan.

Jerry
sumber
Ya, saya telah menyadarinya. Yang tidak menangkap adalah yang saya butuhkan. Saya pikir menggunakan () akan selalu cocok, mengetahui ada opsi untuk tidak mencocokkan berguna, Terima kasih.
NMGod
Anda salah mengerti itu. Di ?:dalam pengelompokan alias non-capturinghanya mengatakan, bahwa Anda tidak dapat menggunakan ekspresi yang cocok dengan $1, $2dan seterusnya ... Jika Anda ingin ekspresi tidak cocok, yang Anda butuhkan adalah ^.
EverythingRightPlace
@ NMGodA1b2c3d4 Terima kasih kembali! Apakah yang Anda maksud adalah opsi untuk tidak mencocokkan atau menangkap (ada perbedaan, ya). Jika Anda tidak ingin mencocokkan semua ini, Anda akan menggunakan (?! ... )insead, artinya (?!s|season)dalam kasus ini.
Jerry
126

Gunakan contoh online langsung ini untuk menguji pola Anda:

masukkan deskripsi gambar di sini

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

Mencocokkan seluruh kata pada baris perintah.

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 kata tertentu pada baris perintah tanpa kata bountaries

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

Variabel gun1dan gun2berisi string dartatau fartyang benar, tetapi gun3 berisi dartydan masih cocok, itulah masalahnya. Jadi ke contoh selanjutnya.

Cocokkan kata-kata tertentu pada baris perintah dengan batas kata:

Batas Kata dapat dicocokkan secara paksa \b, lihat: Analisis visual tentang apa yang dilakukan batas kata dari jex.im/regulex

Gambar Visual Regex diperoleh dari http://jex.im/regulex dan https://github.com/JexCheng/regulex Contoh:

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

The \bmenegaskan bahwa kita memiliki batas kata, memastikan "panah" cocok, tapi "DARTY" tidak.

Eric Leschinski
sumber
3
diberi suara positif karena saya membutuhkan \ b karakter, dan tidak mengetahuinya!
Nieminen
Mengapa penjelasan menyeluruh ini bukan jawabannya?
dewwwald
1
Karena orang yang memposting pertanyaan memilih jawaban pertama yang masuk, dan tidak repot-repot beralih ke jawaban saya ketika jawaban saya yang jauh lebih unggul datang kemudian. Anda dapat meminta penanya melalui komentar di bawah pertanyaan untuk mengubah pilihan jawaban mereka ke yang ini, dan itu akan meningkatkan nilai halaman ini bagi orang-orang yang mendarat di sana.
Eric Leschinski
1
Saya memberi suara positif karena Anda menggunakan kata "kentut" dalam contoh Anda ... dan saya membutuhkan \ w +;)
Sesuatu Pada
Saya menggunakan regexr.com
Applez00800
4

Saya menguji contoh di js. Solusi paling sederhana - cukup tambahkan kata yang Anda butuhkan di dalam / /:

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

Sekarang jika Anda membutuhkan kata khusus ini dengan batas-batas, bukan di dalam huruf-tanda lainnya. Kami menggunakan penanda b :

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

Kami juga memiliki metode exec () di js, yang mana yang mengembalikan hasil objek. Ini membantu fg untuk mendapatkan info tentang tempat / indeks kata kita.

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

Jika kita membutuhkan semua kata yang cocok dalam string / kalimat / teks, kita bisa menggunakan g modifier (pencocokan global):

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

Sekarang yang terakhir - saya tidak perlu 1 kata spesifik, tetapi beberapa di antaranya. Kami menggunakan | tanda, itu berarti pilihan / atau.

"bad dog bad".match(/\bcat|dog\b/g).length
// 1
Vasyl Gutnyk
sumber
2

[ ]mendefinisikan kelas karakter. Jadi setiap karakter yang Anda tetapkan di sana, akan cocok. [012]akan cocok 0atau 1atau 2dan [0-2]berperilaku sama.

Yang Anda inginkan adalah pengelompokan untuk mendefinisikan pernyataan-atau. Menggunakan(s|season) untuk masalah Anda.

Btw. kamu harus hati-hati. Karakter meta dalam ekspresi reguler (atau di dalam pengelompokan) berbeda dari kelas karakter. Kelas karakter seperti sub-bahasa. [$A]hanya akan cocok $atau A, tidak ada yang lain. Tidak ada jalan keluar di sini demi dolar.

EverythingRightPlace
sumber