2010-06-14 2 views

Trả lời

55

Nó là không thể cho cả (?=foo)(?=baz) để phù hợp cùng một lúc. Nó sẽ yêu cầu ký tự tiếp theo là cả hai fb đồng thời điều đó là không thể.

Có lẽ bạn muốn điều này thay vì:

(?=.*foo)(?=.*baz) 

này nói rằng foo phải xuất hiện bất cứ nơi nào và baz phải xuất hiện bất cứ nơi nào, không nhất thiết phải theo thứ tự và có thể chồng chéo (mặc dù chồng chéo là không thể trong trường hợp cụ thể này).

+0

Tôi chỉ cố gắng nó trên http://regexpal.com/. Không có điếu xì gà. Có lẽ đây là một lỗi với regexpal? – user366735

+0

Xin lỗi. Nevermind, điều đó có ý nghĩa. Cảm ơn bạn. – user366735

+0

Bạn có làm điều này để làm việc trên regexpal? Tôi không thể. – paragbaxi

3

Bạn cần một nhà điều hành HOẶC |:

String: foo,bar,baz

Regex: (foo)|(baz)

Kết quả: ["foo", "baz"]

0

Có lẽ bạn đang tìm kiếm một cái gì đó như thế này. Nếu bạn muốn chọn dòng hoàn toàn khi nó chứa cả "foo" và "baz" cùng một lúc, RegEx này sẽ tuân thủ rằng:

.*(foo)+.*(baz)+|.*(baz)+.*(foo)+.*

5

Ví dụ về một Boolean (AND) cộng với tìm kiếm ký tự đại diện, mà tôi đang sử dụng bên trong một Autocomplete Plugin javascript:

string để phù hợp với: "lời Chúa của tôi"

string để tìm kiếm: "tôi đang tìm kiếm các từ hài hước của tôi bên trong văn bản này"

Bạn cần regex sau: /^(?=.*my)(?=.*word).*$/im

Giải thích:

^ vị trí khẳng định lúc bắt đầu của một dòng

= Positive lookahead

?.* trận đấu bất kỳ ký tự (trừ newline)

() Groups

$ khẳng định vị trí ở cuối của một dòng

i modifier: không nhạy cảm. Khớp không phân biệt chữ hoa chữ thường (bỏ qua trường hợp của [a-zA-Z])

m công cụ sửa đổi: nhiều dòng. Nguyên nhân^và $ để phù hợp với bắt đầu/kết thúc của mỗi dòng (không chỉ bắt đầu/kết thúc của chuỗi)

Kiểm tra các Regex đây: https://regex101.com/r/iS5jJ3/1

Vì vậy, bạn có thể tạo một hàm javascript rằng:

  1. Thay regex reserved ký tự để tránh các lỗi
  2. Tách chuỗi tại chỗ
  3. Encapsulate lời của bạn bên trong nhóm regex
  4. Tạo một mô hình regex
  5. Execute trận đấu regex

Ví dụ:

function fullTextCompare(myWords, toMatch){ 
 
    //Replace regex reserved characters 
 
    myWords=myWords.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 
 
    //Split your string at spaces 
 
    arrWords = myWords.split(" "); 
 
    //Encapsulate your words inside regex groups 
 
    arrWords = $.map(arrWords, function(n) { 
 
     return ["(?=.*"+n+")"]; 
 
    }); 
 
    //Create a regex pattern 
 
    sRegex = new RegExp("^"+arrWords.join("")+".*$","im"); 
 
    //Execute the regex match 
 
    return(toMatch.match(sRegex)===null?false:true); 
 
} 
 

 
//Using it: 
 
console.log(
 
    fullTextCompare("my word","I'm searching for my funny words inside this text") 
 
); 
 

 
//Wildcards: 
 
console.log(
 
    fullTextCompare("y wo","I'm searching for my funny words inside this text") 
 
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>