Typeahead无效的正则表达式:/(/:

时间:2016-12-14 12:25:33

标签: javascript typeahead

我添加了一个预先搜索。 Everithing正在发挥作用,但我发现了一个问题。我的json中有文字,例如 "嗨,我的名字是Jason(Mckay)和......"

当我尝试从这个字符串中键入一些单词时,everithin就可以了,但是当我输入" "或" )"我将有一个例外:

Uncaught SyntaxError: Invalid regular expression: /(/: Unterminated group

我正在研究先行者"基础知识"并有相同的错误:

https://twitter.github.io/typeahead.js/examples/#prefetch

当我尝试首先输入任何nubmers " 1" " 2" 等等时...... / p>

这是我的默认substringMatcher,问题出在哪里:

var substringMatcher = function(strs) {
      return function findMatches(q, cb) {
        var matches, substringRegex;

        // an array that will be populated with substring matches
        matches = [];

        // regex used to determine if a string contains the substring `q`
        substrRegex = new RegExp(q, 'i');

        // iterate through the pool of strings and for any string that
        // contains the substring 'q', add it to the 'matches' array
        $.each(strs, function(i, str) {
          if (substrRegex.test(str)) {
            matches.push(str);
          }
        });
        cb(matches);
      };
    };

1 个答案:

答案 0 :(得分:2)

使用正则表达式会很痛苦,因为所有“特殊”字符都是([etc

您的代码似乎很简单,无论如何都不能使用RegExp - indexOf应该做的伎俩

var substringMatcher = function(strs) {
    return function findMatches(q, cb) {
        q = q.toLowerCase();
        var matches = strs.filter(function(str) {
            return str.toLowerCase().indexOf(q) >= 0; 
        });
        cb(matches);
    };
};

是的,ES2015 +有String#includes方法更有意义使用 - 但为什么不使用ES2015 +的所有好处

const substringMatcher = strs => (q, cb) => {
    q = q.toLowerCase();
    cb(strs.filter(str => str.toLowerCase().includes(q))); 
};

或效率较低(toLowerCase比需要更频繁地调用,但代码更性感

const substringMatcher = strs => (q, cb) => cb(strs.filter(str => str.toLowerCase().includes(q.toLowerCase())));