2011-08-26 3 views
11

У меня есть следующая строка: pass[1][2011-08-21][total_passes]Regex, чтобы захватить строки в квадратных скобках

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

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

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

 
console.log(result);

, но это только возвращает [1].

Не знаете, как это сделать .. Заранее спасибо.

ответ

27

Вы почти там, вам просто нужно global match (обратите внимание на /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/

+0

Это возвращает строки, которые я хочу, но они все еще находятся в скобках. – Growler

+0

Я изо всех сил пытаюсь разобрать содержимое массива в многострочном формате. Вот пример. 'export const routes: Routes = [ {path: '', pathMatch: 'full', redirectTo: 'tree'}, {path: 'components', redirectTo: 'components/tree'}, {path: ' компоненты/дерево ', компонент: CstdTree}, {путь:' компоненты/чипы ', компонент: CstdChips} ]; –

0

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

match(/\[(.*?)\]/g) 
4
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]' ] 
-1

[C#]

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

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

0

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

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

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

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

Смежные вопросы