2015-02-07 2 views
0

im пытается найти определенные шаблоны классов для скрипта. , но мой вызов regex не находит все вхождения. Вместо этого он просто возвращает первый.jquery regex просто находит первое вхождение

string = "col-xs-1 col-md-middle col-lg-middle" 
s = /col(?:-(..)-|-)(?:middle|top|bottom)/g.exec(string); 
console.log(s) 

output -> ["col-md-middle", "md"] 

Кто-нибудь знает, что я делаю здесь неправильно?

ответ

2

Использование string.match функция. exec с глобальным регулярным выражением предназначен для использования в цикле, поскольку он все равно будет извлекать все согласованные подвыражения.

> str.match(/col(?:-(..)-|-)(?:middle|top|bottom)/g) 
[ 'col-md-middle', 'col-lg-middle' ] 

Если вы хотите получить матч так же, как и захватить, используйте нижеследующее.

> var re = /col(?:-(..)-|-)(?:middle|top|bottom)/g; 
undefined 
> var m; 
undefined 
> var a = []; 
undefined 
> while ((m = re.exec(str)) != null) { 
... a.push(m[0]) 
... a.push(m[1]) 
... } 
4 
> a 
[ 'col-md-middle', 
    'md', 
    'col-lg-middle', 
    'lg' ] 

Reference

+0

может вы могли бы сказать, мой почему исходный код не работает так, как должно быть? – ceed

+0

Функция 're.exec' возвращает только первое совпадение. Но когда он используется внутри цикла, он будет печатать все совпадения, поскольку цикл повторяется до тех пор, пока не будет найдено совпадение. –

+0

хорошо логично, возможно, из-за причин скорости, все еще запутывая, почему они не сделали это gloval. в любом случае thx – ceed

0
var t = this 
     s = t.attr('class').match(/(col(-(..)-|-)(middle|top|bottom))/g).join(' ').split('-'); 
    $(s).each(function(k,v){ 
     if (k%2!==0) { 
      // here i get the string after col- 
     } 
    }); 

здесь мое решение, немного меньше, и я хотел бы избежать в то время как они просто любят петли бесконечности сами

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