2013-08-10 3 views
2
var s = "lala url(ok) tee hee url(oh ya) kk"; 
s.match(/url(([^)]+))/g); 

С 's' Я пытаюсь извлечь:Regex найти шаблон, вернуть подшаблонов

['ok', ' oh ya '] 

но, получая:

["url(ok", "url(oh ya "] 

Я могу перебрать этот список и удалить 'url (', но я подозреваю, что некоторое regex-fu также может удалить его.

+0

Вы, кажется, знаете, что '(...)' обозначает группу захвата в регулярном выражении, не обрабатывается * буквально *. Почему вы думали тогда, что одна из двух пар в 'url ((...))' будет обрабатываться по-другому? –

ответ

1

Вам нужно сбежать из первого набора круглых скобок как

s.match(/url\(([^)]+)\)/g); 

Обращаем ваше внимание, что ok и oh ya будут включены в группы захвата вместо совпадений напрямую.

Вы можете получить захваченной группы, как:

var str = "lala url(ok) tee hee url(oh ya) kk", 
    re = /\(([^)]+)\)/g, match ; 

while((match = re.exec(str)) !== null) 
    console.log(match[0] + " : " + match[1]); 

/* Prints: 
    url(ok) : ok 
    url(oh ya) : oh ya 
*/ 
0

заменить:

s.match(/url(([^)]+))/g); 

на:

s.match(/url\(([^)]+)\)/g); 
2

в другой поддержки языка регулярных выражений 'назад с помощью регулярных выражений, как этот (?<=url\()(([^)]+))

Но, к сожалению, javascript regex не поддерживает lookbehind как this example, поэтому вы должны перебирать его. Кроме того, вам не нужно, чтобы url слово для включения.

+0

Правда, но для получения желаемой информации нет необходимости искать. –

+0

ему нужно ** url ** за текущим регулярным выражением! – Angga

+0

Несомненно, но ничего не нужно в любом случае. Можно использовать 'regex.exec' (http://jsfiddle.net/B4kJf/). Но, возможно, это то, что вы имели в виду под «итерацией». –

1

Даже после фиксации выражения, когда вы используете флаг g и .match, значения, захваченные группами захвата, не включаются в результат.

Но вы все равно можете получить то, что вы хотите с помощью .exec:

var s = "lala url(ok) tee hee url(oh ya) kk"; 
var pattern = /url\(([^)]+)\)/g; 
var urls = []; 
var match; 
while(match = pattern.exec(s)) { 
    // match is an array like ["url(ok)", "ok"] 
    urls.push(result[1]); 
} 

// urls will be ["ok", " oh ya "] 

В каждой итерации match будет массив, содержащий полный матч в качестве первого элемента и значение каждой группы захвата в качестве дополнительного элемента из массив.

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