如何匹配由一个字符拆分的多个子字符串

How to match multiple substrings splitted by a character?

本文关键字:拆分 字符串 字符 何匹配 一个      更新时间:2023-09-26

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

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

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

有多种方法可以做到这一点,但这里有一种方法只有一个循环:

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"
]

示例fiddle

一个单个循环就足够了:

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

然而,我认为使用regex完全是高估了这一点,使用标准字符串split方法就足够了。通过使用数组迭代方法,您甚至可以绕过编写显式循环:

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方法,当然它们在内部对数组进行循环。