如何匹配由角色分割的多个子串?

时间:2014-09-09 20:02:13

标签: javascript regex string substring

说我有以下字符串:aaa.bbb.ccc.ddd.eee。我想在每次出现时用.字符拆分此字符串,除了最后一次出现。换句话说,我希望我的结果如下:

[
    "aaa.bbb.ccc.ddd.eee",
    "bbb.ccc.ddd.eee",
    "ccc.ddd.eee",
    "ddd.eee"
]

我只能通过多个显式循环来实现这一点,但我想尽可能避免这种情况。我不是JavaScript的主人,也许有一些我不知道的功能,这可能有所帮助。使最终解决方案更短更简单。

2 个答案:

答案 0 :(得分:2)

这有多种方法,但这里有一个循环:

function splitAndJoin(val) {
    var retVal = [];
    val = val.split('.');

    while(val.length > 1) {
        retVal.push(val.join('.'));
        val.shift();
    }

    return retVal;
}

用法:

splitAndJoin('aaa.bbb.ccc.ddd.eee')

结果:

[
  "aaa.bbb.ccc.ddd.eee",
  "bbb.ccc.ddd.eee",
  "ccc.ddd.eee",
  "ddd.eee"
]

Example fiddle

答案 1 :(得分:1)

单个循环应该足够了:

var string = "aaa.bbb.ccc.ddd.eee",
    result = [],
    regex = /[^.]*\./g,
    m;
while (m = regex.exec(string))
    result.push(string.slice(m.index));

但是,我认为使用正则表达式对此完全过分,使用标准string split method就足够了。通过使用array iteration methods,您甚至可以编写显式循环

var string = "aaa.bbb.ccc.ddd.eee";
return string.split(".") // ["aaa","bbb","ccc","ddd","eee"]
.map(function(_, i, parts) { // for each index
    return parts.slice(i); // make an array with a different length
}).filter(function(p) {
    return p.length >= 2; // take only the arrays with at least two parts
}).map(function(p) {
    return p.join("."); // make a string from each of those arrays
});

正如@ dc5所说,有多种方法可以做到这一点。您可能已经使用了多个(嵌套)循环,因为您不知道Array slicejoin方法,当然这些方法在内部循环遍历数组。