2013-03-22 10 views
10

tôi đưa ra một chuỗi có thể bao gồm cả văn bản và dữ liệu số:Extract dữ liệu số từ chuỗi trong groovy

Ví dụ:

"100 pound" "Tôi nghĩ 173 lbs" "73 lbs. "

Tôi đang tìm một cách rõ ràng để chỉ trích xuất dữ liệu số từ các chuỗi này.

Đây là những gì tôi đang làm dải phản ứng:

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 
    } 
} 

Trả lời

20

Bạn có thể sử dụng findAll sau đó chuyển đổi các kết quả vào Số nguyên:

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 ] 

Nếu bạn cần số thập phân và số âm, bạn có thể sử dụng một regex phức tạp hơn:

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

Giải pháp mà tôi đã kết thúc thực hiện dựa trên những lời khuyên trên, tôi chỉ muốn lấy số đầu tiên (nếu có bội số, tôi làm mất hiệu lực phản hồi). Cảm ơn @tim_yates! 'def extractNumericData (Chuỗi phản hồi) { nếu (phản hồi) { def numberList = response.findAll (/[0-9]+.[0-9]*|[0-9]*.[0-9 ] + | [0-9] + /) if (numberList.size() == 1) { trở numberList.get (0) như BigDecimal } else { trở -1 }} } ' –

1

Sau khi thêm ing phương pháp dưới đây, numbersFilter, qua metaclass, bạn có thể gọi nó như sau:

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 

Thêm mã này Như 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(); 
       } 
      } 

}