2013-03-22 5 views
10

Я даюсь строку, которая может включать в себя текст и числовые данные:Извлечение числовые данные из строки в заводной

Примеры:

«100 фунтов» «Я думаю, что 173 фунтов» «73 фунтов. "

Я ищу чистый способ извлечь только числовые данные из этих строк.

Вот что я сейчас делаю, чтобы лишить ответ:

def stripResponse(String response) { 
    if(response) { 
     def toRemove = ["lbs.", "lbs", "pounds.", "pounds", " "] 
     def toMod = response 
     for(remove in toRemove) { 
      toMod = toMod?.replaceAll(remove, "") 
     } 
     return toMod 
    } 
} 

ответ

20

Вы можете использовать findAll затем преобразовать результаты в Целые:

def extractInts(String input) { 
    input.findAll(/\d+/)*.toInteger() 
} 

assert extractInts("100 pounds is 23" ) == [ 100, 23 ] 
assert extractInts("I think 173 lbs" ) == [ 173 ] 
assert extractInts("73 lbs."   ) == [ 73 ] 
assert extractInts("No numbers here"  ) == [] 
assert extractInts("23.5 only ints"   ) == [ 23, 5 ] 
assert extractInts("positive only -13") == [ 13 ] 

Если вам нужны десятичные и отрицательные числа, вы можете использовать более сложное регулярное выражение:

def extractInts(String input) { 
    input.findAll(/-?\d+\.\d*|-?\d*\.\d+|-?\d+/)*.toDouble() 
} 

assert extractInts("100 pounds is 23" ) == [ 100, 23 ] 
assert extractInts("I think 173 lbs" ) == [ 173 ] 
assert extractInts("73 lbs."   ) == [ 73 ] 
assert extractInts("No numbers here" ) == [] 
assert extractInts("23.5 handles float") == [ 23.5 ] 
assert extractInts("and negatives -13" ) == [ -13 ] 
+0

Решение, которое я в конечном итоге реализации на основе рекомендаций выше, я хочу только возьмите первое число (если есть кратные, я аннулирую ответ). Спасибо @tim_yates! 'def extractNumericData (String response) { if (response) { def номерList = response.findAll (/[0-9]+.[0-9]*|[0-9]*.[0-9 ] + | [0-9] + /) , если (numberList.size() == 1) { возврата numberList.get (0) в качестве BigDecimal } еще { возврата -1 }} } ' –

1

После добавления ING метод ниже, numbersFilter через метакласса, можно назвать следующие:

assert " i am a positive number 14".numbersFilter() == [ 14 ] 
assert " we 12 are 20.3propaged 10.7".numbersFilter() == [ 12,20.3,10.7 ] 
assert " we 12 a20.3p 10.7 ,but you can select one".numbersFilter(0) == 12 
assert " we 12 a 20.3 pr 10.7 ,select one by index".numbersFilter(1) == 20.3 

Добавьте этот код Как Bootstrap

String.metaClass.numbersFilter={index=-1-> 
      def tmp=[]; 
      tmp=delegate.findAll(/-?\d+\.\d*|-?\d*\.\d+|-?\d+/)*.toDouble() 
      if(index<=-1){ 
       return tmp; 
      }else{ 
       if(tmp.size()>index){ 
        return tmp[index]; 
       }else{ 
        return tmp.last(); 
       } 
      } 

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