使用唯一关键字分隔JavaScript数组

时间:2016-02-11 20:09:48

标签: javascript arrays regex

我正在尝试通过查找关键字与数组进行交互,并将包含它们的密钥拆分为两个或更多个密钥,一个包含关键字,另一个包含关键字的开头和结尾。

例如,鉴于我有关键词“cat”和“dog”

var arrayinput = ["acat", "zdogg", "dogs"];

所需的输出将是

[ "a", "cat", "z", "dog", "g", "dog", "s" ]

我一直在制作包含关键字模式并使用.match()的正则表达式。

但是,“acat”之类的内容会返回与关键字“cat”的有效匹配。鉴于“acat”,我需要单独看“a”,然后将“cat”视为有效。

4 个答案:

答案 0 :(得分:3)

在此处查看:https://jsfiddle.net/3jtqc2s2/

arrayinput = [].concat.apply([], arrayinput.map(function (v) {
    return v.split(/(cat|dog)/);
})).filter(function(v) {
 return v !== "";
});

这也将检测多种猫或狗的术语。

答案 1 :(得分:0)

使用Array.forEachString.match函数的解决方案:

var arrayinput = ["acat","zdogg","dogs"],
    result = [],
    matches;

    arrayinput.forEach(function(word){
        matches = word.match(/^(\w*)(cat|dog)+(\w*)$/i);
        if (matches[1]) result.push(matches[1]);
        if (matches[2]) result.push(matches[2]);
        if (matches[3]) result.push(matches[3]);

    });

    console.log(result);
    // the output:
    ["a", "cat", "z", "dog", "g", "dog", "s"]

答案 2 :(得分:0)

使用标准循环的另一种解决方案:

    var result = [];
    for(var currentValue of arrayinput) {
        var obj = currentValue.split(/(cat|dog)/);
        result = result.concat(obj.filter(function(v) {return v != '';}));
    }

答案 3 :(得分:0)

使用强制转换为字符串,正则表达式替换和强制回到数组的三个相关解决方案。没有使用循环。不是说它优雅,高效或推荐,只是有可能。

var arrayinput = ["acat", "zdogg", "dogs"];

document.write(
  arrayinput
    .join(" ")                            // coerce to space-separated string
    .replace(/(cat|dog)/g, " $1 ")        // flank all keywords with spaces
    .replace(/ +/g, " ")                  // collapse multiple spaces to one
    .trim()                               // remove leading or trailing spaces
    .split(" ")                           // re-create array, splitting at spaces
);

document.write("<br />");

document.write(
  arrayinput
    .join(" ")                            // coerce to space-separated string
    .replace(/\B(cat|dog)/g, " $1")       // precede embedded keyword-starts with spaces
    .replace(/(cat|dog)\B/g, "$1 ")       // follow embedded keyword-ends with spaces
    .split(" ")                           // re-create array, splitting at spaces
);

document.write("<br />");

document.write(
  arrayinput
    .toString()                           // coerce to comma-separated string
    .replace(/([^,])(cat|dog)/g, "$1,$2") // precede embedded keyword-starts with commas
    .replace(/(cat|dog)([^,])/g, "$1,$2") // trail embedded keyword-ends with commas
    .split()                              // re-create array, splitting at commas
);