Biểu thức chính quy để khớp với một từ hoặc tiền tố của nó


119

Tôi muốn so khớp một biểu thức chính quy trên toàn bộ từ.

Trong ví dụ sau Tôi cố gắng để phù hợp shay seasonnhưng những gì tôi có trận đấu s, e, a, on.

[s|season]

Làm cách nào để tạo một biểu thức chính quy để khớp với cả một từ?


4
Sử dụng (season|s)thay thế. [season]khớp với bất kỳ s, e, a, o, n.
falsetru

Câu trả lời:


137

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), on.

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.


Vâng, tôi đã nhận ra điều đó. Không chụp là những gì tôi cần. Tôi nghĩ rằng sử dụng () sẽ luôn luôn khớp, biết rằng có một tùy chọn không khớp là rất hữu ích, Cảm ơn bạn.
NMGod

Bạn đã hiểu sai điều đó. Bên ?:trong một nhóm aka non-capturingchỉ 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, $2v.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à ^.
EverythingRightPlace

@ NMGodA1b2c3d4 Không có chi! Ý của bạn là một lựa chọn không khớp hoặc không bắt kịp (có sự khác biệt). Nếu bạn không muốn khớp với bất kỳ cái nào trong số này, bạn sẽ sử dụng (?! ... )insead, nghĩa là (?!s|season)trong trường hợp này.
Jerry

126

Sử dụng ví dụ trực tuyến trực tiếp này để kiểm tra mẫu của bạn:

nhập mô tả hình ảnh ở đâ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

Khớp với bất kỳ từ nào trên dòng lệnh.

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$content3với(\w)+ mô hình.

$ content1 và $ content2 chứa ít nhất một từ, $ content3 thì không.

Khớp một từ cụ thể trên dòng lệnh mà không có tiền thưởng từ

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 gun1gun2chứa chuỗi darthoặc fartđúng, nhưng gun3 chứa dartyvà vẫn khớp, đó là vấn đề. Vì vậy, vào ví dụ tiếp theo.

Ghép các từ cụ thể trên dòng lệnh với ranh giới từ:

Các ranh giới từ có thể được kết hợp với nhau \b, xem: Phân tích trực quan về những gì wordboundary đang làm từ jex.im/regulex

Regex Visual Image có được từ http://jex.im/regulexhttps://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 \bnhậ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.


3
ủng hộ vì tôi cần ký tự \ b và không biết điều đó!
Nieminen

Tại sao lời giải thích cặn kẽ này không phải là câu trả lời?
dewwwald

1
Bởi vì người đăng câu hỏi đã chọn câu trả lời đầu tiên và không thèm chuyển sang câu trả lời của tôi khi câu trả lời cao cấp hơn rất nhiều của tôi đến sau đó. Bạn có thể yêu cầu người đặt câu hỏi thông qua nhận xét dưới câu hỏi để thay đổi lựa chọn câu trả lời của họ thành lựa chọn này và nó sẽ nâng cao giá trị của trang này đối với những người truy cập vào nó.
Eric Leschinski

1
Tôi đã ủng hộ vì bạn đã sử dụng từ "xì hơi" trong ví dụ của mình ... và tôi cần \ w +;)
SomethingOn vào

Tôi sử dụng regexr.com
Applez00800

4

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

2

[ ]đị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 0hoặc 1hoặc 2[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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.