2017-01-13 11 views
0

Я работаю по методе, который экстрактов правильный номер версии из строки (для последующего comparisation, если есть новая версия).Extract правильное сочетание цифр из строки

Строка, которая снабжена Unfortunatly имеет нет фиксированного шаблона и может иметь несколько комбинаций цифр.

Ниже кода разбирает номер версии, но если строка включает в себя, например построить 50124 этого число вставленных после извлеченной версии комбинации, которые я не хотим.

Возможно также, что комбо в строке возможно, например, v1.12 [build452] или v1.32.856 (сборка 8754), но я уже позаботился об этом с помощью , подставляя детали по [или (.

метод в вопросе:

private String extractVersion(String str){ 
     str = str.substring(str.lastIndexOf('v'), 
       str.indexOf('[') != -1 ? str.indexOf('[') : str.length()).trim(); 
     str = str.substring(str.lastIndexOf('v'), 
       str.indexOf('(') != -1 ? str.indexOf('(') : str.length()).trim(); 
     return str.replaceAll("[^0-9?!\\.]", ""); 
    } 

Я испытал это на некоторых примерах, но к сожалению результат не то, что я хочу, иногда цифры приклеиваются за фактической номер версии, я имею в logcat output.

Есть ли «лучшее» регулярное выражение или другой способ, который я могу использовать для улучшения метода, поэтому он извлекает правильный номер версии?

Благодарим за помощь.

.. 
NewVersion = tempWatchList.get(i); 
    Log.w("Versionnr", extractVersion(NewVersion)); 
    Log.e("Versionname", NewVersion); 
.. 

Logcat Outout:

/Versionnr: 5.131 //should be 5.13 
/Versionname: somename v5.13b1 
/Versionnr: 2.0..4 //should be 2.0 
/Versionname: another name 2 v2.0.exp.4 
/Versionnr: 18.01 //should be 18.0 
/Versionname: somename v18.0-ALPHA1 
/Versionnr: 7.2.42221..3634639 //should be 7.2.4222 
/Versionname: another name v7.2.4222-1.L.3634639 
/Versionnr: 5.0.220170112 //should be 5.0.2 
/Versionname: somename v5.0.2 build 20170112 
/Versionnr: 4.4.0.201701124401 //should be 4.4.0 
/Versionname: another name v4.4.0.20170112b4401 
+0

'/ Versionnr: 5.131 // должно быть 5.13 /Versionname: somename v5.13b1' Почему вы это вспять? Пожалуйста, сначала укажите/запишите, что у вас есть, а затем извлеките из него. Сейчас очень запутанно. – greenapps

+0

Почему вы просто не сравниваете все строки? Тогда вы не будете знать, является ли это более новой версией, но если это другая версия. Хорошо, если это достаточно хорошо. – greenapps

+0

Реверсирование? Я только хочу показать, что не так с помощью logcat. Я не могу сравнить полную строку, поскольку строка не имеет фиксированного шаблона. somename v1.3 build5421 может быть предоставлен как (новая версия) как somename * v1.4 build 42 – Simon

ответ

1

Вы можете использовать это, чтобы извлечь версии:

Pattern p = Pattern.compile("[0-9]+([.][0-9]+){1,2}"); 
Matcher m = p.matcher(NewVersion); 
m.find(); 
Log.w("Versionnr", m.group()); 
+0

Thx но v4.1.0.9205 дает 4.1.0 в качестве вывода? – Simon

+0

Согласно примеру v4.4.0.20170112b4401, я предположил, что вы хотите извлечь только до трех цифр пакетов –

+0

Я вижу, но это не намерение. – Simon

0

Это работает со всеми примерами из ваших LogCat сообщений:

Pattern pattern = Pattern.compile("\\d+\\.\\d+(\\.[\\d]+)?"); 
Matcher matcher = pattern.matcher(NewVersion); 
if (matcher.find()) { 
    String version = matcher.group(); 
} 

https://regex101.com/r/P7lICp/1

Лично я бы передумал, что вы делаете.