我正在开发一种方法,从字符串中提取正确的版本号(如果有新版本,稍后进行比较)。
不幸地提供的字符串没有固定模式,可以有多个数字组合。
下面的代码会解析版本号,但如果字符串包含例如 build 50124 ,那么在提取的版本组合后粘贴不> 强烈的>想要的。
也可能是字符串中的组合是可能的,例如v1.12 [build452]或v1.32.856(build 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输出。
是否有更好的'正则表达式或我可以用来改进方法的其他方法,所以它提取正确的版本号?
感谢您的帮助。
..
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 :(得分:1)
您可以使用它来提取版本:
Pattern p = Pattern.compile("[0-9]+([.][0-9]+){1,2}");
Matcher m = p.matcher(NewVersion);
m.find();
Log.w("Versionnr", m.group());
答案 1 :(得分: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
就个人而言,我会重新考虑你在做什么。