2013-08-28 21 views
5

Tôi không hiểu nhiều biểu thức chính quy đó và tôi muốn tạo biểu thức phù hợp với hai chuỗi.Biểu thức chính quy Javascript khớp với hai chuỗi

Tôi biết rằng đối với một chuỗi mã là .match(/something/) và nếu trận đấu trên hai dây đó là .match(/something|someotherthing/)

Làm thế nào để viết một mà chỉ phù hợp khi cả hai chuỗi được tìm thấy trong văn bản ví dụ như "google microsoft"

Trả lời

9

Để làm điều đó với một cụm từ thông dụng duy nhất, bạn sẽ cần tính đến thực tế là chúng có thể đến theo một trong hai thứ tự. (.* khớp với bất kỳ ký tự ở giữa hai chuỗi con):

/google.*microsoft|microsoft.*google/ 

Lưu ý: Nếu bạn muốn làm nhiều hơn 2 chuỗi con này sẽ được ra khỏi tay. 3 chuỗi có thể có trong 6 các đơn đặt hàng khác nhau, 5 chuỗi có thể đến trong các đơn đặt hàng 120 và 10 đoạn có thể được đặt hàng 3628800 các cách khác nhau! Đó là lý do tại sao sử dụng các tính năng của ngôn ngữ (Javascript), giống như trong câu trả lời của Explosion Pills, có thể tốt hơn nhiều so với cố gắng làm quá nhiều với một biểu thức chính quy.

5

Bạn chỉ có thể sử dụng .match hai lần

str.match(/google/) && str.match(/microsoft/) 

Trong trường hợp đó nó có thể được nhanh hơn để sử dụng .indexOf

Bạn cũng có thể sử dụng một regex verbose

.match(/google.*microsoft|microsoft.*google/) 
+0

@ m.buettner điểm tuyệt vời. –

+0

Tôi biết rằng tôi có thể sử dụng 'match' hai lần nhưng tôi muốn nó với regex để làm cho nó ngắn hơn .. nhưng với regex nó có vẻ dài hơn bằng cách sử dụng' match' hai lần – Enve

+0

@Enve ngắn mã không nhất thiết phải là nhất có thể đọc được. Đặc biệt nếu mã "dài" đã khớp với một hoặc hai dòng. –

6

Những câu trả lời khác là hoàn toàn tốt cho vấn đề cụ thể của bạn, nhưng như Paulpro lưu ý thực sự có được ra khỏi tay khi bạn có nhiều hơn hai từ.

Cách dễ nhất là sử dụng nhiều lần kiểm tra như Explosion Pills gợi ý.

Nhưng đối với một khả năng mở rộng hơn regex chỉ tiếp cận bạn có thể sử dụng lookaheads:

/^(?=.*google)(?=.*microsoft)(?=.*apple).../ 

Các lookahead không thực sự tiêu thụ bất cứ điều gì, vì vậy sau khi điều kiện đầu tiên được kiểm tra (mà .*google thể phù hợp), bạn có trở lại ở đầu chuỗi và có thể kiểm tra điều kiện tiếp theo. Các mô hình chỉ vượt qua nếu tất cả các lookaheads làm.

Lưu ý rằng nếu đầu vào của bạn có thể bị ngắt dòng, .* sẽ không hoạt động. Bạn sẽ phải sử dụng [^]* hoặc [\s\S]* thay vào đó (cùng với câu trả lời của người khác).