Câu trả lời:
Dấu ngoặc vuông có nghĩa là cho lớp nhân vật, và bạn đang thực sự cố gắng để phù hợp với bất kỳ một trong số: s
, |
, s
(một lần nữa), e
, a
, s
(một lần nữa), o
và n
.
Sử dụng dấu ngoặc đơn để phân nhóm:
(s|season)
hoặc nhóm không chụp:
(?:s|season)
Lưu ý: Các nhóm không nắm bắt thông báo cho công cụ rằng nó không cần lưu trữ kết quả trùng khớp, trong khi nhóm còn lại (nhóm bắt giữ). Đối với những thứ nhỏ, có thể hoạt động, đối với những thứ 'nặng nhọc', trước tiên bạn có thể muốn xem mình có cần sự phù hợp hay không. Nếu không, tốt hơn hãy sử dụng nhóm không chụp để phân bổ thêm bộ nhớ cho việc tính toán thay vì lưu trữ thứ gì đó mà bạn sẽ không bao giờ cần sử dụng.
?:
trong một nhóm aka non-capturing
chỉ nói rằng bạn không thể sử dụng các biểu thức được so khớp với $1
, $2
v.v. Nếu bạn muốn một biểu thức không được so khớp, điều bạn cần là ^
.
(?! ... )
insead, nghĩa là (?!s|season)
trong trường hợp này.
Ảnh chụp màn hình phía trên được lấy từ ví dụ trực tiếp này: https://regex101.com/r/cU5lC2/1
Tôi sẽ sử dụng shell tương tác phpsh trên Ubuntu 12.10 để chứng minh công cụ regex PCRE thông qua phương pháp được gọi là preg_match
Bắt đầu phpsh, đặt một số nội dung vào một biến, khớp trên word.
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
Phương pháp preg_match sử dụng động cơ PCRE trong ngôn ngữ PHP để phân tích biến: $content1
, $content2
và $content3
với(\w)+
mô hình.
$ content1 và $ content2 chứa ít nhất một từ, $ content3 thì không.
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
Các biến gun1
và gun2
chứa chuỗi dart
hoặc fart
đúng, nhưng gun3 chứa darty
và vẫn khớp, đó là vấn đề. Vì vậy, vào ví dụ tiếp theo.
Các ranh giới từ có thể được kết hợp với nhau \b
, xem:
Regex Visual Image có được từ http://jex.im/regulex và https://github.com/JexCheng/regulex Ví dụ:
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
Xác \b
nhận rằng chúng ta có một ranh giới từ, đảm bảo rằng "dart" được khớp, nhưng "darty" thì không.
Tôi kiểm tra các ví dụ trong js. Giải pháp đơn giản nhất - chỉ cần thêm từ bạn cần vào bên trong / /:
var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result
Bây giờ nếu bạn cần từ cụ thể này với ranh giới, không bên trong bất kỳ ký tự-ký tự nào khác. Chúng tôi sử dụng điểm đánh dấu b :
var reg = /\bcat\b/
reg.test('acatb');//1 test
false // result
reg.test('have cat here');//2 test
true // result
Chúng ta cũng có phương thức execute () trong js, whichone trả về đối tượng-kết quả. Nó giúp fg nhận được thông tin về vị trí / chỉ mục của từ của chúng tôi.
var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5
Nếu chúng ta cần lấy tất cả các từ phù hợp trong chuỗi / câu / văn bản, chúng ta có thể sử dụng công cụ sửa đổi g (đối sánh toàn cục):
"cat good cat good cat".match(/\bcat\b/g).length
// 3
Bây giờ là từ cuối cùng - tôi không cần 1 từ cụ thể, mà là một số trong số chúng. Chúng tôi sử dụng | dấu hiệu, nó có nghĩa là sự lựa chọn / hoặc.
"bad dog bad".match(/\bcat|dog\b/g).length
// 1
[ ]
định nghĩa một lớp ký tự. Vì vậy, mọi ký tự bạn đặt ở đó, sẽ khớp. [012]
sẽ khớp 0
hoặc 1
hoặc 2
và [0-2]
hoạt động giống nhau.
Những gì bạn muốn là các nhóm để xác định một câu lệnh hoặc. Sử dụng(s|season)
cho vấn đề của bạn.
Btw. bạn phải coi chừng. Siêu ký tự trong regex bình thường (hoặc bên trong một nhóm) khác với lớp ký tự. Một lớp ký tự giống như một ngôn ngữ phụ. [$A]
sẽ chỉ khớp $
hoặc A
, không có gì khác. Không trốn thoát ở đây cho đồng đô la.
(season|s)
thay thế.[season]
khớp với bất kỳs
,e
,a
,o
,n
.