2013-05-12 3 views
-3

Я пишу регулярное выражение, чтобы извлечь второе совпадение в javascript. Мой предназначенный экстракт - «attributes_», расположенный сразу после «root_first_attributes_0_second_». Для примера см. Фрагмент кода ниже.regex: фиксировать только второе вхождение

template = "root_first_attributes_0_second_attributes_0_third_attributes_0_third_name" 

my regex 
========== 
var n = template.match(/(attributes[_\]\[]+)\d+/g) 

Мое состоят регулярное выражение не работает так, как я хотел, как это возвращение всех вхождений шаблона согласования, то есть три из них вернулись.

любой совет будет оценен.

+0

вероятно, чистейший решение просто взять второй матч вернулся. – soulcheck

+1

Если вы хотите второй, просто выберите его: 'var n = template.match (/ (attributes [_ \] \ [] +) \ d +/g) [1]' – Atle

+0

что-то вроде этого: '(?: (атрибуты [_ \] \ [] +) \ d + (?:. *?)) {2} '? http://www.regex101.com/r/sI0lK5 –

ответ

1

Описание

Рассмотрим следующий Powershell пример регулярного выражения, который должен работать в JavaScript (или это было для меня на http://www.pagecolumn.com/tool/regtest.htm. Группа регулярное выражение вернуть $ 1 будет содержать подстроку значение в области атрибутов второго варианта. Я модифицировать исходный текст, чтобы показать, что это будет также найти underbars внутри атрибута подстроки.

^.*?_0_[^_]*[_](.*?)(_0_|$)

Пример
$Matches = @() 
$String = 'root_first_attributes_0_second_Attributes_ToVoteFor_0_third_attributes_0_third_name' 
Write-Host start with 
write-host $String 
Write-Host 
Write-Host found 
([regex]'^.*?_0_[^_]*[_](.*?)(_0_|$)').matches($String) | foreach { 
    write-host "key at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'" 
    } # next match 

Урожайность

начинаются с: root_first_attributes_0_second_Attributes_ToVoteFor_0_third_attributes_0_third_name

найдено ключ на 31 = 'Attributes_ToVoteFor'

Резюме

  • ^ от начала строки
  • .*? двигаться через l восток количество символов, чтобы достичь
  • _0_ первого разделителя
  • [^_]* затем перейти через следующие без подчеркивания символов
  • [_], пока не прочитали первое подчеркивание
  • (.*?) захвата и возвращает все символы перед
  • (_0_|$) следующий разделитель или конец строки

Дополнительный кредит

Чтобы захватить поле атрибутов для X-ой группы в списке, вы можете изменить регулярное выражение, сделав нежирный поиск в блок без захвата, за которым следует счет.Они могут быть проверены на www.pcreck.com/JavaScript/advanced

  • ^(?:.*?_0_){0}[^_]*[_](.*?)(?=_0_|$) спички first_attributes
  • ^(?:.*?_0_){1}[^_]*[_](.*?)(?=_0_|$) спички Attributes_ToVoteFor
  • ^(?:.*?_0_){2}[^_]*[_](.*?)(?=_0_|$) спички attributes
  • ^(?:.*?_0_){3}[^_]*[_](.*?)(?=_0_|$) спички name
Смежные вопросы