Regex для захвата строк между квадратными скобками

У меня есть следующая строка: pass[1][2011-08-21][total_passes]

Как извлечь элементы между квадратными скобками в массив? Я попробовал

match(/\[(.*?)\]/);

var s = 'pass[1][2011-08-21][total_passes]';
var result = s.match(/\[(.*?)\]/);

console.log(result);

Ответ 1

Вы почти находитесь, вам просто нужно глобальное соответствие (обратите внимание на флаг /g):

match(/\[(.*?)\]/g);

Пример: http://jsfiddle.net/kobi/Rbdj4/

Если вы хотите что-то, что захватывает только группу (из MDN):

var s = "pass[1][2011-08-21][total_passes]";
var matches = [];

var pattern = /\[(.*?)\]/g;
var match;
while ((match = pattern.exec(s)) != null)
{
  matches.push(match[1]);
}

Пример: http://jsfiddle.net/kobi/6a7XN/

Другой вариант (который я обычно предпочитаю), злоупотребляет обратным вызовом замены:

var matches = [];
s.replace(/\[(.*?)\]/g, function(g0,g1){matches.push(g1);})

Пример: http://jsfiddle.net/kobi/6CEzP/

Ответ 2

var s = 'pass[1][2011-08-21][total_passes]';

r = s.match(/\[([^\]]*)\]/g);

r ; //# =>  [ '[1]', '[2011-08-21]', '[total_passes]' ]

example proving the edge case of unbalanced [];

var s = 'pass[1]]][2011-08-21][total_passes]';

r = s.match(/\[([^\]]*)\]/g);

r; //# =>  [ '[1]', '[2011-08-21]', '[total_passes]' ]

Ответ 3

добавьте глобальный флаг в ваше регулярное выражение и выполните итерацию возвращаемого массива.

 match(/\[(.*?)\]/g)

Ответ 4

Я не уверен, можете ли вы получить это непосредственно в массив. Но следующий код должен работать, чтобы найти все вхождения, а затем обработать их:

var string = "pass[1][2011-08-21][total_passes]";
var regex = /\[([^\]]*)\]/g;

while (match = regex.exec(string)) {
   alert(match[1]);
}

Обратите внимание: я действительно думаю, что вам нужен класс символов [^ \]] здесь. В противном случае в моем тесте выражение будет соответствовать строке отверстия, потому что] также совпадает с. *.

Ответ 5

[С#]

        string str1 = " pass[1][2011-08-21][total_passes]";
        string matching = @"\[(.*?)\]";
        Regex reg = new Regex(matching);
        MatchCollection matches = reg.Matches(str1);

вы можете использовать foreach для совпадающих строк.