如何在匹配的“[abc]”中排除“[”和“]”?

时间:2013-05-19 03:58:11

标签: javascript regex

我有以下字符串:

[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);

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

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

的正则表达式

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

第1组将包含打开和关闭括号之间所有文本的字符串数组

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

匹配将拉出所有匹配的子串并显示它们,因为它只使用正则表达式,它运行速度稍快,然后使用切片

  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
        )

)