Извлечение числовых данных из строки в Groovy
мне дается строка, которая может включать как текстовые, так и числовые данные:
примеры:
"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
}
}
2 ответов
можно использовать 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 ]
после добавления метода ниже ,numbersFilter
, через metaClass, вы можете вызвать его следующим образом:
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();
}
}
}