2015-05-23 2 views
-3
var rgx = /<td.+ headers=["']d8.+ ["']>(.+)<\/td>/i, 
    str = "<tr><td class='' headers='d8073e47 d8073e50 '>.cpp</td><td class='' headers='d8073e47 d8073e50 '>text/x-c</td></tr>", 
    matches = []; 
if(rgx.exec(str)&&rgx.exec(str)[1]) { 
    console.log(rgx.exec(str)[1]); 
    matches.push(rgx.exec(str)[1]) 
} 
console.log(matches); 

У меня есть этот код, и он возвращает последний объект всегда. Когда я пытаюсь установить глобальный флаг, он дает ошибку, но это регулярное выражение должно соответствовать .cpp и text/x-c.regex exec метод не работает

Как решить эту проблему?

ответ

2

Каждый раз, когда вы звоните exec, вы повторяете один шаг и переходите к следующему матчу. Вы делаете это слишком много.

Вы также можете сделать соответствующую группу непристойной. Вы всегда должны быть очень осторожны, когда пишете такие вещи, как .* или .+, поскольку они могут соответствовать больше, чем вы хотите.

Я установил свой код так:

var rgx = /<td[^\>]+ headers=["']d8[^\>]+ ["']>(.+?)<\/td>/ig, 
    str = "<tr><td class='' headers='d8073e47 d8073e50 '>.cpp</td><td class='' headers='d8073e47 d8073e50 '>text/x-c</td></tr>", 
    matches = [], 
    res; 
while (res = rgx.exec(str)) { 
    matches.push(res[1]); 
} 
console.log(matches); 

Demonstration

+0

когда я пытаюсь в то время как петля с глобальным флагом он входит в бесконечный цикл – nikoss

+0

@nikoss Пробовали ли вы демонстрацию? Потому что он работает ... –

+0

в любом случае дает ошибку не может прочитать свойство null @dystroy – nikoss