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 для совпадающих строк.