0

我在 StackOverflow 的其他地方发现了此代码的变体。它从文本区域中获取所有单词并将它们转换为正则表达式。然后它测试一个数组以查看正则表达式中的所有单词是否都包含在数组中:

<textarea id="inputtext" type="text"></textarea>
<input id="searchbutton" type="button" value="Click me" />

var links = new Array("taxi","Alpha","runway");


$("#searchbutton").click(function () {
    var query = $("#inputtext").val();
    var querywords = query.split(',');

    for (var i = 0; i < querywords.length; i++) {
        var regex = new RegExp('(?=.*\\b' + querywords[i].split(' ').join('\\b)(?=.*\\b')    + '\\b)', 'i', 'g');
        for (var j = 0; j < links.length; j++) {
            if (regex.test(links[j])) {                      
                console.log("Correct");
            }
        }
    }
});

如果 textarea 单词包含数组中的所有关键字,如何反转该过程以使程序返回“true”?例如,如果 textarea 有句子“Taxi to the runway via taxway alpha”,并且名为“links”的数组包含关键字“taxi”、“alpha”和“runway”,则程序将返回“true”。

4

3 回答 3

3

您拥有的那个脚本似乎检查了数组中是否出现了任何单词。你想要的是everyArray 方法

var text = "Taxi to the runway via taxiway alpha",
    links = ["taxi", "alpha", "runway"];

console.log( links.every(function(word) {
    return new RegExp("\\b"+word+"\\b", "i").test(text);
}) ); // true
于 2013-09-13T13:02:19.560 回答
1

非正则表达式的方式是:

var arr = ['word1', 'word2'], haystack = textArea.value.toLowerCase().split(/\s+/);
var result = true, i = 0;
for(i=0; i<arr.length; i++) {
    if(haystack.indexOf(arr[i].toLowerCase()) === -1) {
        result = false;
        break;
    }
}
于 2013-09-13T13:01:58.103 回答
1

其他答案提供的方法很简单,但它们可能更有效。使用对象作为映射来加速查找几乎总是更好,而不必每次都搜索整个数组。

var words = ['word1', 'word2'],
    wordsMap = 'text area content, word1 and word2'.split(/\W+/).reduce(function (obj, word) {
        obj[word] = true;
        return obj;
    }, {}),
    areWordsAllContained = words.every(function (word) {
        return wordsMap[word.toLowerCase()];
    });

console.log(areWordsAllContained); //true

编辑:我已将拆分正则表达式从更改\s+\W+以确保它拆分每个非单词字符。

于 2013-09-13T13:19:37.400 回答