Извлечение числовых данных из строки в 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
    }
}

Ответ 1

Вы можете использовать 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 ]

Ответ 2

После добавления метода ниже, 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();
                }
            }

}

Ответ 3

Положите это здесь для людей, которые также нуждаются в этом.

Вместо того, чтобы создавать новый вопрос, все, что мне было нужно, это одно число из строки.

Я сделал это с помощью регулярных выражений.

def extractInt( String input ) {
  return input.replaceAll("[^0-9]", "")
}

Где вход может быть this.may.have.number4.com и вернуть 4

Я получал сообщение об ошибке выше (возможно, из-за моей версии Jenkins) - По какой-то причине я получаю это: java.lang.UnsupportedOperationException: spread not yet supported in input.findAll(\d+)*.toInteger() - - И на Дженкинсе написано, что это решено.

Надеюсь это поможет.