使用正则表达式捕获组特定次数但最后一组具有剩余值

时间:2016-06-09 21:07:02

标签: javascript regex

给定一个由冒号分隔的字符串,与此类似......

xvf:metric:admin:click

我需要捕捉三组......

xvf
metric
admin:click

或另一个例子:

one:two:three:four:five:six:seven

one
two
three:four:five:six:seven

我当前的正则表达式只是单独捕获每个单词,导致4个匹配

/(\s*\w+)/gi

4 个答案:

答案 0 :(得分:1)

使用String.matchArray.slice函数的解决方案:

var str = "one:two:three:four:five:six:seven",
    groups = str.match(/([^:]+?):([^:]+?):(.+)?$/).slice(1);

console.log(groups);  // ["one", "two", "three:four:five:six:seven"]

答案 1 :(得分:1)

如果您可能少于3组,则可以使用

/^([^:]+)(?::([^:]+)(?::(.+)?)?)?$/

你可以找到"解释" RegExp的here

答案 2 :(得分:0)

解决方案是在:之前捕获前两个内容,然后在

之后捕获所有内容

这是正则表达式:

/(.+?):(.+?):(.+)/

在代码中:

var testStr = "xvf:metric:admin:click";

console.log(/(.+?):(.+?):(.+)/.exec(testStr).slice(1,4))
//["xvf", "metric", "admin:click"]

答案 3 :(得分:0)

由于您使用的是JavaScript,因此实际使用string.split及更晚Array.sliceArray.splice进行字符串操作更有意义:

var str = "one:two:three:four:five:six:seven",
  groups = str.split(':');
groups.splice(2, groups.length, groups.slice(2).join(':'));
console.log(groups);