从字符串中提取正确的数字组合

Extract correct combination of digits from string

我正在研究一种方法,该方法从字符串中提取正确的版本号(如果有新版本,则稍后进行比较).

不幸的是,正在提供的字符串 没有固定模式,可以有 多个数字组合

下面的代码解析版本号,但如果字符串包含例如 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输出.

是否有 'better' 正则表达式或其他方法可以用来改进方法,以便提取正确的版本号?

感谢您的帮助。

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

Logcat输出:

/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

您可以使用它来提取版本:

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

这适用于您 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

就个人而言,我会重新考虑你在做什么。