JavaScript RegExp - 查找特定字符之前的所有前缀
JavaScript RegExp - find all prefixes up to a certain character
我有一个由斜杠分隔的术语组成的字符串 ('/'
),例如:
ab/c/def
我想找到这个字符串的所有前缀,直到出现斜杠或字符串结尾,即对于上面的示例,我希望得到:
ab
ab/c
ab/c/def
我试过这样的正则表达式:/^(.*)[\/$]/
,但它 returns 是一个单独的匹配项 - ab/c/
与括号内的结果 ab/c
,因此。
编辑:
我知道这可以使用 split
轻松完成,我正在寻找使用 RegExp
的解决方案。
你不能只在分隔符上拆分字符串吗?
var result = 'ab/c/def'.split(/\//g);
我认为正则表达式不是您想要的。对数组进行简单的拆分和循环即可得出结果。
var str = "ab/c/def";
var result = str.split("/").reduce(function(a,s,i){
var last = a[i-1] ? a[i-1] + "/" : "";
a.push(last + s);
return a;
}, []);
console.log(result);
或其他方式
var str = "ab/c/def",
result = [],
parts=str.split("/");
while(parts.length){
console.log(parts);
result.unshift(parts.join("/"));
parts.pop();
}
console.log(result);
还有很多其他方法可以做到。
不,您不能使用纯正则表达式来做到这一点。
为什么? 因为您需要从字符串中的同一位置开始的子字符串,而正则表达式匹配不重叠的文本块,然后推进其索引以搜索另一个匹配。
好的,捕获组怎么样? 只有当您知道输入字符串中有多少 /
分隔的块时,它们才有用。然后你可以使用
var s = 'ab/c/def'; // There are exact 3 parts
console.log(/^(([^\/]+)\/[^\/]+)\/[^\/]+$/.exec(s));
// => [ "ab/c/def", "ab/c", "ab" ]
但是,您不太可能知道有关输入字符串的很多细节。
您可以使用以下代码而不是正则表达式:
var s = 'ab/c/def';
var chunks = s.split('/');
var res = [];
for(var i=0;i<chunks.length;i++) {
res.length > 0 ? res.push(chunks.slice(0,i).join('/')+'/'+chunks[i]) : res.push(chunks[i]);
}
console.log(res);
首先,你可以用/
分割字符串。然后,遍历元素并构建 res
数组。
你不能用 javascript 中的 RegEx 来做到这一点,但你可以拆分部分并将它们分别连接在一起:
var array = "ab/c/def".split('/'), newArray = [], key = 0;
while (value = array[key++]) {
newArray.push(key == 1 ? value : newArray[newArray.length - 1] + "/" + value)
}
console.log(newArray);
可能是这样
var str = "ab/c/def",
result = str.match(/.+?(?=\/|$)/g)
.map((e,i,a) => a[i-1] ? a[i] = a[i-1] + e : e);
console.log(result);
我有一个由斜杠分隔的术语组成的字符串 ('/'
),例如:
ab/c/def
我想找到这个字符串的所有前缀,直到出现斜杠或字符串结尾,即对于上面的示例,我希望得到:
ab
ab/c
ab/c/def
我试过这样的正则表达式:/^(.*)[\/$]/
,但它 returns 是一个单独的匹配项 - ab/c/
与括号内的结果 ab/c
,因此。
编辑:
我知道这可以使用 split
轻松完成,我正在寻找使用 RegExp
的解决方案。
你不能只在分隔符上拆分字符串吗?
var result = 'ab/c/def'.split(/\//g);
我认为正则表达式不是您想要的。对数组进行简单的拆分和循环即可得出结果。
var str = "ab/c/def";
var result = str.split("/").reduce(function(a,s,i){
var last = a[i-1] ? a[i-1] + "/" : "";
a.push(last + s);
return a;
}, []);
console.log(result);
或其他方式
var str = "ab/c/def",
result = [],
parts=str.split("/");
while(parts.length){
console.log(parts);
result.unshift(parts.join("/"));
parts.pop();
}
console.log(result);
还有很多其他方法可以做到。
不,您不能使用纯正则表达式来做到这一点。
为什么? 因为您需要从字符串中的同一位置开始的子字符串,而正则表达式匹配不重叠的文本块,然后推进其索引以搜索另一个匹配。
好的,捕获组怎么样? 只有当您知道输入字符串中有多少 /
分隔的块时,它们才有用。然后你可以使用
var s = 'ab/c/def'; // There are exact 3 parts
console.log(/^(([^\/]+)\/[^\/]+)\/[^\/]+$/.exec(s));
// => [ "ab/c/def", "ab/c", "ab" ]
但是,您不太可能知道有关输入字符串的很多细节。
您可以使用以下代码而不是正则表达式:
var s = 'ab/c/def';
var chunks = s.split('/');
var res = [];
for(var i=0;i<chunks.length;i++) {
res.length > 0 ? res.push(chunks.slice(0,i).join('/')+'/'+chunks[i]) : res.push(chunks[i]);
}
console.log(res);
首先,你可以用/
分割字符串。然后,遍历元素并构建 res
数组。
你不能用 javascript 中的 RegEx 来做到这一点,但你可以拆分部分并将它们分别连接在一起:
var array = "ab/c/def".split('/'), newArray = [], key = 0;
while (value = array[key++]) {
newArray.push(key == 1 ? value : newArray[newArray.length - 1] + "/" + value)
}
console.log(newArray);
可能是这样
var str = "ab/c/def",
result = str.match(/.+?(?=\/|$)/g)
.map((e,i,a) => a[i-1] ? a[i] = a[i-1] + e : e);
console.log(result);