2012-04-14 22 views
17

Có cách nào trong JavaScript để nhận giá trị Boolean cho khớp của chuỗi so với mảng biểu thức chính quy không?javascript - đối sánh cụm từ thông dụng với mảng các mục

Các ví dụ sẽ là (nơi 'nếu' tuyên bố là đại diện cho những gì tôi đang cố gắng để đạt được):

var thisExpressions = [ '/something/', '/something_else/', '/and_something_else/']; 
var thisString = 'else'; 

if (matchInArray(thisString, thisExpressions)) { 

} 
+0

Cách bạn không sử dụng vòng lặp? –

+0

Bạn đang tìm kiếm một kết quả phù hợp với tất cả các biểu thức (AND), hoặc bất kỳ biểu thức nào (OR)? – Arth

+0

Với jquery bạn có thể sử dụng jQuery.inArray(); – GillesC

Trả lời

7

http://jsfiddle.net/9nyhh/1/

var thisExpressions = [/something/, /something_else/, /and_something_else/]; 
var thisExpressions2 = [/else/, /something_else/, /and_something_else/]; 
var thisString = 'else'; 

function matchInArray(string, expressions) { 

    var len = expressions.length, 
     i = 0; 

    for (; i < len; i++) { 
     if (string.match(expressions[i])) { 
      return true; 
     } 
    } 

    return false; 

}; 

setTimeout(function() { 
    console.log(matchInArray(thisString, thisExpressions)); 
    console.log(matchInArray(thisString, thisExpressions2)); 
}, 200)​ 
+0

Cảm ơn gillesc - dường như nó hoạt động tốt! – user398341

+1

Tại sao không loại bỏ biến res hoàn toàn, trả về true trong câu lệnh if của bạn và trả về false ở cuối. Sau đó, nó sẽ bỏ việc tìm kiếm trận đấu đầu tiên. – Arth

+0

Ngoài ra tôi muốn sử dụng biểu thức [i] .test (string) thay vì string.match() – Arth

4

Bạn có thể sử dụng .test() mà trả về một giá trị boolean khi tìm thấy những gì bạn đang tìm kiếm bằng một chuỗi khác:

var thisExpressions = [ '/something/', '/something_else/', '/and_something_else/']; 
var thisString = new RegExp('\\b' + 'else' + '\\b', 'i'); 
var FoundIt = thisString.test(thisExpressions); 
if (FoundIt) { /* DO STUFF */ } 
+0

RegExp.prototype.test() không thể được sử dụng với một mảng. Phải mất một chuỗi. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test – gdibble

+1

@gdibble nó sẽ hoạt động, bởi vì 'test' nó gọi' toString' trên đối số được cung cấp, , đối với mảng, sẽ 'join()'. Có lẽ là không nên mặc dù! – WickyNilliams

+0

Ví dụ: '/monkey/.test ({toString:() =>" monkey "}) // true' – WickyNilliams

1

nhìn theo cách này ...

function matchInArray(stringSearch, arrayExpressions){ 
    var position = String(arrayExpressions).search(stringSearch); 
    var result = (position > -1) ? true : false 
    return result; 
} 
+0

Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung liên quan đến _why_ và/hoặc _how_ nó trả lời câu hỏi sẽ đáng kể cải thiện giá trị dài hạn . Xin vui lòng [sửa] câu trả lời của bạn để thêm một số lời giải thích. –

-1

Vì vậy, chúng tôi thực hiện một chức năng theo chuỗi chữ và mảng chúng tôi muốn xem xét. nó trả về một mảng mới với các kết quả phù hợp được tìm thấy. Chúng ta tạo một đối tượng regexp mới bên trong hàm này và sau đó thực hiện một String.search trên mỗi phần tử phần tử trong mảng. Nếu tìm thấy, nó sẽ đẩy chuỗi vào một mảng mới và trả về.

// literal_string: a regex search, like /thisword/ig 
// target_arr: the array you want to search /thisword/ig for. 

function arr_grep(literal_string, target_arr) { 
    var match_bin = []; 
    // o_regex: a new regex object. 
    var o_regex = new RegExp(literal_string); 
    for (var i = 0; i < target_arr.length; i++) { 
    //loop through array. regex search each element. 
    var test = String(target_arr[i]).search(o_regex); 
    if (test > -1) { 
    // if found push the [email protected] into our matchbin. 
    match_bin.push(target_arr[i]); 
    } 
    } 
    return match_bin; 
} 

// arr_grep(/.*this_word.*/ig, someArray) 
+0

như thế nào? đó là tốt hơn yeah? – Mod

20

Sử dụng một cách tiếp cận chức năng hơn, bạn có thể thực hiện phù hợp với một lớp lót bằng một array function:

ECMAScript 6:

const regexList = [/apple/, /pear/]; 
const text = "banana pear"; 
const isMatch = regexList.some(rx => rx.test(text)); 

ECMAScript 5:

var regexList = [/apple/, /pear/]; 
var text = "banana pear"; 
var isMatch = regexList.some(function(rx) { return rx.test(text); }); 
+0

Giải pháp đơn giản tuyệt vời. Tôi sử dụng nó để kiểm tra các giá trị useragent trong express.js – Blejzer

+0

Cũng đáng nói đến phương pháp 'filter' cho' Array ', thường hữu ích và được sử dụng theo cách tương tự. –

Các vấn đề liên quan