2014-10-18 1 views
0

Я пытаюсь создать совпадение, чтобы соответствовать регулярному выражению и возвращать определенный индекс, но, несмотря на множество вариантов кода, он либо генерирует исключение, либо только печатает один символов, а не целого слова. Все примеры, которые я нахожу, похожи на то, что я делаю, но мои результаты не похожи на примеры. Вот код:groovy matcher не работает или возвращает одиночные символы, а не целые слова

def RAW = """ 
     policer-profile "GD-1" 
      bandwidth cir 4992 cbs 32767 eir 4992 ebs 32767 
      traffic-type all 
      compensation 0 
     exit 
     policer-profile "EIR-1" 
      bandwidth cir 0 cbs 0 eir 9984 ebs 32767 
      traffic-type all 
      compensation 0 
     exit 
     shaper-profile "Shaper1" 
      bandwidth cir 999936 cbs 65535 
      compensation 0 
     exit 
""" 

RAW.split("\n").each() { line -> 
    def matcher = line =~ /bandwidth cir \d+ cbs \d+/ 
    if (matcher) { 
     println line[0][2] 
    } 
} 

я получаю либо «индекс вне диапазона» или он просто печатает «N» (третий символ) в слове «пропускной способности» для каждой строки, вместо числового значения после " cir "(третье слово). Любая помощь будет принята с благодарностью. Заранее спасибо.

+0

Я попытался добавить. * До конца, и теперь это не похоже на что-либо - я использовал [regexr] (http://regexr.com), чтобы проверить его с помощью группировки (line = ~/regex /), и он работает там, но groovy console, похоже, не узнает его. – wolverene13

+0

Я все еще ничего не получаю при использовании этого кода, может быть, это моя версия groovy console или что-то еще? У меня 2.3.6 – wolverene13

ответ

1

Я sligthly изменил сценарий:

def RAW = """ 
     policer-profile "GD-1" 
      bandwidth cir 4992 cbs 32767 eir 4992 ebs 32767 
      traffic-type all 
      compensation 0 
     exit 
     policer-profile "EIR-1" 
      bandwidth cir 0 cbs 0 eir 9984 ebs 32767 
      traffic-type all 
      compensation 0 
     exit 
     shaper-profile "Shaper1" 
      bandwidth cir 999936 cbs 65535 
      compensation 0 
     exit 
""" 

RAW.split("\n").each() { line -> 
    def matcher = line =~ /\s+bandwidth cir (\d+) cbs (\d+).*/ 
    if(matcher.matches()) { 
     println "cir: ${matcher[0][1]}, cbs: ${matcher[0][2]}" 
    } 
} 

Вы имели ошибочное регулярное выражение (пробелы в начале, а не соответствие конца строки) и помните, для вывода групп, взятых из matcher не из line , Теперь это должно сработать.

+0

Удивительный, это сработало! На этот раз я получу этот материал-помощник. Кажется, мои проблемы обычно возникают из-за плохого регулярного выражения. Это нормально? – wolverene13

+0

Возможно. Если есть проблема с использованием регулярного выражения, будет еще один :). Пожалуйста примите ;) – Opal

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

  • Нет связанных вопросов^_^