Javascript 使用RegExp递归检索多个捕获组

Javascript 使用RegExp递归检索多个捕获组,javascript,regex,recursion,Javascript,Regex,Recursion,我有一个以下格式的字符串: #someID@tn@company@somethingNew@classing@somethingElse@With 可能会有无限多个分隔的单词,但整个字符串肯定是以开头的# 我已经编写了下面的regexp,虽然它与它匹配,但是我无法得到每个@分隔的单词,我得到的是最后一个递归和第一个(以及整个字符串)。如何分别获取元素中每个单词的数组 (?:^\#\w*)(?:(\@\w*)+) //I know I have ruled out second capturin

我有一个以下格式的字符串:

#someID@tn@company@somethingNew@classing@somethingElse@With
可能会有无限多个分隔的单词,但整个字符串肯定是以开头的#

我已经编写了下面的regexp,虽然它与它匹配,但是我无法得到每个@分隔的单词,我得到的是最后一个递归和第一个(以及整个字符串)。如何分别获取元素中每个单词的数组

(?:^\#\w*)(?:(\@\w*)+) //I know I have ruled out second capturing group with ?: , though doesn't make much difference.
下面是我的Javascript代码:

var reg = /(?:^\#\w*)(?:(\@\w*)+)/g;

var x = null;


while(x = reg.exec("#someID@tn@company@somethingNew@classing@somethingElse@With"))
{
  console.log(x); 
}
下面是结果(Firebug,控制台):

编辑: 如果可能,我希望使用正则表达式输出如下:

["#someID", "@tn", @company", "@somethingNew", "@classing", "@somethingElse", "@With"]
请注意,我需要一个RegExp解决方案。我知道String.split()和字符串操作。

您可以使用:

var s = '#someID@tn@company@somethingNew@classing@somethingElse@With'
if (s.substr(0, 1) == "#")
    tok = s.substr(1).split('@');    
    //=> ["someID", "tn", "company", "somethingNew", "classing", "somethingElse", "With"]

你也可以试试这个正则表达式

((?:@|#)\w+)

说明:

  • ()
    捕获组。捕获组中的任何内容都将被捕获
  • (?:)
    它只匹配字符串,但不会捕获任何内容
  • @|#
    文字
    @
    符号
  • \w+
    后跟一个或多个单词字符

> "#someID@tn@company@somethingNew@classing@somethingElse@With".split(/\b(?=@|#)/g);
[ '#someID',
  '@tn',
  '@company',
  '@somethingNew',
  '@classing',
  '@somethingElse',
  '@With' ]

没有regExp会更容易:

var str = "#someID@tn@company@somethingNew@classing@somethingElse@With";
var strSplit = str.split("@");
for(var i = 1; i < strSplit.length; i++) {
    strSplit[i] = "@" + strSplit[i];
}
console.log(strSplit);
// ["#someID", "@tn", "@company", "@somethingNew", "@classing", "@somethingElse", "@With"]
var str=”#someID@tn@company@somethingNew@classing@somethingElse@与”;
var strSplit=str.split(“@”);
对于(变量i=1;i
这种情况下的预期输出是什么?您确定
[“#someID”@tn@company“,“@somethingNew”、“@classing”、“@somethingElse”、“@With”]
是您期望的输出,而不是
[“#someID”、“@tn”、“@company”、“@somethingNew”、“@classing”、“@somethingElse”、“@With”]
@user3853834你是说@chris97on你是right@AvinashRaj请将其作为答案发布,如果可能,请解释。无论如何,谢谢。我知道,我需要regexpThank@zx81。用户3853834:
String#split
使用
regex
进行拆分。如果能以较低的复杂度解决问题,就不应该使问题复杂化。这难道不符合
someID@email.com
第一个字符丢失时,在哪里
#
?@anubhava很抱歉,我没有收到你的评论。你的链接只是回到这个帖子。请让我把这个帖子作为一个答案。是的,我已经读过了。我只是指出这种方法的问题。
var str = "#someID@tn@company@somethingNew@classing@somethingElse@With";
var strSplit = str.split("@");
for(var i = 1; i < strSplit.length; i++) {
    strSplit[i] = "@" + strSplit[i];
}
console.log(strSplit);
// ["#someID", "@tn", "@company", "@somethingNew", "@classing", "@somethingElse", "@With"]