3

我有以下字符串:

[a] [abc] test [zzzz]

我试图得到一个像这样的数组:

[0] => a
[1] => abc
[2] => zzzz

我试过以下代码:

var string = '[a] [abc] test [zzzz]';
var matches = string.match(/\[(.*?)\]/g);
for(var i = 0; i < matches.length; i++)
    console.log(matches[i]);

但我的控制台输出显示:

[a]
[abc]
[zzzz]

我尝试添加两个非捕获组 ( ?:),如下所示:

var matches = string.match(/(?:\[)(.*?)(?:\])/g);

但我看到相同的比赛,没有改变。

出了什么问题,我怎样才能得到我想要的数组?

4

2 回答 2

3

match不捕获全局匹配中的组。为此,我做了一个小帮手。

String.prototype.gmatch = function(regex) {
  var result = [];
  this.replace(regex, function() {
    var matches = [].slice.call(arguments,1,-2);
    result.push.apply(result, matches);
  });
  return result;
};

并像这样使用它:

var matches = string.gmatch(/\[(.*?)\])/g);
于 2013-05-19T04:01:02.877 回答
0

正则表达式

[[]\s*(\b[^]]*\b)\s*[\]]

第 1 组将包含一个包含左括号和右括号之间所有文本的字符串数组

仅正则表达式解决方案的示例

Match 将提取所有匹配的子字符串并显示它们,因为它只使用正则表达式,它会比使用 slice 运行得稍微快一些

  var re = /[[]\s*(\b[^]]*\b)\s*[\]]/;
  var sourcestring = "source string to match with pattern";
  var results = [];
  var i = 0;
  for (var matches = re.exec(sourcestring); matches != null; matches = re.exec(sourcestring)) {
    results[i] = matches;
    for (var j=0; j<matches.length; j++) {
      alert("results["+i+"]["+j+"] = " + results[i][j]);
    }
    i++;
  }


(
    [0] => Array
        (
            [0] => [a]
            [1] => [abc]
            [2] => [zzzz]
        )

    [1] => Array
        (
            [0] => a
            [1] => abc
            [2] => zzzz
        )

)
于 2013-05-19T14:16:22.617 回答