2013-02-16 3 views
2

У меня есть регулярное выражение:Получить индекс группы, который соответствует регулярному выражению?

/(alpha)|(beta)|(gamma)/gi 

Некоторые текст в соответствии с:

Betamax. Digamma. Alphabet. Hebetation. 

Спички являются:

beta, gamma, alpha, beta 

значения Ищу бы:

1,2,0,1 

... могу ли я определить индекс группы, который соответствует регулярному выражению?

ответ

5

Для access the groups, вам нужно будет использовать .exec() неоднократно:

var regex = /(alpha)|(beta)|(gamma)/gi, 
    str = "Betamax. Digamma. Alphabet. Hebetation."; 
for (var nums = [], match; match = regex.exec(str);) 
    nums.push(match.lastIndexOf(match[0])); 

Если вы хотите indizes нулевой основе, вы можете использовать

nums.push(match.slice(1).indexOf(match[0])); 
+0

Это мой любимый пока, я люблю использовать манипуляции результатами, чтобы получить результат на основе нуля. –

+1

Да, это выглядит красиво и позволяет нам использовать 'indexOf' вместо обратного поиска. Хотя, просто добавление '- 1' к первому было бы короче и более результативным :) – Bergi

1

Создайте регулярное выражение из массива строк, а затем найдите совпадения с indexOf.

1

Если мы рассмотрим точную сэмпл при условии, ниже будет работать:

var r = /(alpha)|(beta)|(gamma)/gi; 
var s = "Betamax. Digammas. Alphabet. Habetation."; 

var matched_indexes = []; 
var cur_match = null; 

while (cur_match = r.exec(s)) 
{ 
    matched_indexes.push(cur_match[1] ? 0 : cur_match[2] ? 1 : 2); 
} 

console.log(matched_indexes); 

Я оставляю вам, чтобы сделать содержание цикла более динамичного/родовым: р

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