Jawaban:
Kurung dimaksudkan untuk kelas karakter, dan Anda benar-benar mencoba untuk mencocokkan salah satu dari: s
, |
, s
(lagi), e
, a
, s
(lagi), o
dan 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.
?:
dalam pengelompokan alias non-capturing
hanya mengatakan, bahwa Anda tidak dapat menggunakan ekspresi yang cocok dengan $1
, $2
dan seterusnya ... Jika Anda ingin ekspresi tidak cocok, yang Anda butuhkan adalah ^
.
(?! ... )
insead, artinya (?!s|season)
dalam kasus ini.
Tangkapan layar di atas diambil dari contoh langsung ini: https://regex101.com/r/cU5lC2/1
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
, $content2
dan $content3
dengan (\w)+
pola.
$ content1 dan $ content2 mengandung setidaknya satu kata, $ content3 tidak.
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 gun1
dan gun2
berisi string dart
atau fart
yang benar, tetapi gun3 berisi darty
dan masih cocok, itulah masalahnya. Jadi ke contoh selanjutnya.
Batas Kata dapat dicocokkan secara paksa \b
, lihat:
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 \b
menegaskan bahwa kita memiliki batas kata, memastikan "panah" cocok, tapi "DARTY" tidak.
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
[ ]
mendefinisikan kelas karakter. Jadi setiap karakter yang Anda tetapkan di sana, akan cocok. [012]
akan cocok 0
atau 1
atau 2
dan [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.
(season|s)
sebagai gantinya.[season]
cocok salahs
,e
,a
,o
,n
.