/^.*?\bcat\b.*?\bmat\b.*?$/m
Sử dụng m
modifier (trong đó đảm bảo metacharacters đầu/kết thúc trận đấu trên ngắt dòng chứ không phải tại đầu và cuối chuỗi):
^
trận đấu dòng bắt đầu
.*?
khớp với mọi thứ trên dòng trước ...
\b
phù hợp với một ranh giới từ sự xuất hiện đầu tiên của một ranh giới từ (như @codaddict đã thảo luận)
- sau đó là chuỗi
cat
và một ranh giới từ khác; lưu ý rằng dấu gạch dưới được coi là ký tự "từ", do đó, _cat_
sẽ không phải là đối sánh *;
.*?
: bất kỳ ký tự trước ...
- ranh giới,
mat
, ranh giới
.*?
: bất kỳ ký tự còn lại trước khi ...
$
: cuối dòng.
Điều quan trọng là phải sử dụng \b
để đảm bảo những lời quy định không nằm trong từ dài hơn, và điều quan trọng là phải sử dụng ký tự đại diện không tham lam (.*?
) so với tham lam (.*
) vì sau này sẽ thất bại trên chuỗi như " Có một con mèo ở trên tấm thảm dưới con mèo. " (Nó sẽ phù hợp với sự xuất hiện cuối cùng của "mèo" chứ không phải là người đầu tiên.)
* Nếu bạn muốn để có thể phù hợp với _cat_
, bạn có thể sử dụng:
/^.*?(?:\b|_)cat(?:\b|_).*?(?:\b|_)mat(?:\b|_).*?$/m
mà phù hợp hoặc nhấn hoặc ranh giới từ xung quanh các từ được chỉ định. (?:)
cho biết nhóm không chụp, có thể trợ giúp hiệu suất hoặc tránh các cảnh quay bị xung đột.
Chỉnh sửa: Một câu hỏi được nêu ra trong các nhận xét về việc liệu giải pháp có hiệu quả cho các cụm từ thay vì chỉ là các từ hay không. Câu trả lời là hoàn toàn có. Sau đây sẽ phù hợp với "Một dòng trong đó bao gồm cả hai cụm từ đầu tiên và cụm từ thứ hai":
/^.*?(?:\b|_)first phrase here(?:\b|_).*?(?:\b|_)second phrase here(?:\b|_).*?$/m
Chỉnh sửa 2: Nếu tự không quan trọng, bạn có thể sử dụng:
/^.*?(?:\b|_)(first(?:\b|_).*?(?:\b|_)second|second(?:\b|_).*?(?:\b|_)first)(?:\b|_).*?$/m
Và nếu hiệu suất là thực sự là một vấn đề ở đây, có thể là một vấn đề (nếu động cơ regex của bạn hỗ trợ nó) có thể (nhưng có lẽ sẽ không) thực hiện tốt hơn so với ở trên, nhưng tôi sẽ để lại cả phiên bản phức tạp và thử nghiệm hiệu suất được cho là một bài tập cho người hỏi/người đọc.
Được chỉnh sửa theo nhận xét của @Alan Moore. Tôi không có cơ hội để kiểm tra nó, nhưng tôi sẽ nói lời của bạn cho nó.
thế nào về ' "catmat" '- nên regex phù hợp với nó? những từ đó có phải là toàn bộ từ không? Làm thế nào về ''vấn đề scathing' ' – Amarghosh
Không, nó không nên phù hợp với một trong số đó. Chỉ hai từ đó, theo thứ tự đó, trước và sau đó là bất kỳ văn bản nào khác. –
Vui lòng xem chỉnh sửa của tôi nếu bạn đang sử dụng mã của tôi. – eyelidlessness