我正在通过删除所有非数字字符和保留点“来比较版本字符串。”
oldStr = "Old string v1.9.552.6"
String resultOld = oldStr.replaceAll("[^\\d.]", "");
resultOld = 1.9.552.6
newStr = "New string v2.0.1"
String resultNew = newStr.replaceAll("[^\\d.]", "");
resultNew = 2.0.1
编辑:一些示例字符串:
3C New 2017 program v1.2.3253.2.5beta52 --> should be 1.2.3253.2.552
3C New 2017 program v1.2.3253.2.5 b458 --> should be 1.2.3253.2.5458
我的问题是,有时字符串包含无效的数字字符,这使得比较无效。
newStr = "3New 2017-string v2.0.1"
这将导致以下无效版本字符串:320172.0.1, 所以我的问题是如何从字符串中删除无效的数字字符(3和2017),这样我就可以得到一个有效的版本字符串?
PS:我不知道前面的无效数字字符串,所以它们可以是任何数字。
我已经尝试过比较这些字符,但我认为我走错了轨道:
private void removeDuplicates(String oldStr, String newStr) {
char[] charsNew = newStr.toCharArray();
char[] charsOld = oldStr.toCharArray();
Set<Character> NewPresent = new HashSet<>();
for (int b = 0; b < charsOld.length; b++) {
if (!Arrays.equals(charsNew, charsOld)) {
NewPresent.add(charsNew[b]);
// Just to check output
Log.w("CHARS", NewPresent.toString());
}
}
}
答案 0 :(得分:1)
试试这个
/([\d]+\..*?[^a-zA-Z]*)/g
这是正则表达式101演示 https://regex101.com/r/GCs7mb/3
答案 1 :(得分:1)
为什么不试试这个
/(\d+\.)+\d+[a-z]*\d*/g
匹配任何x。 1次或更多次,然后是数字 这样,如果它们遵循x.x格式
,则会提取出所有版本这将返回带有&#39; beta&#39;的版本。 然后,您可以在该字符串上使用另一个正则表达式来排除非法beta
/[^a-z]/g
答案 2 :(得分:0)
经过数小时的测试和搜索,我找到了我需要的模式。 赞成JBone和Nanotron的答案,指出我正确的方向。
对于任何想要使用它的人来说,这是工作代码:
private String getVersion(String Str) {
StringBuilder version = new StringBuilder();
Pattern p = Pattern.compile("(\\d+\\.)+\\s*\\s*(\\d+)|(\\d+)(?!.*\\d)");
Matcher m = p.matcher(Str);
while (m.find()) {
version.append(m.group());
}
return version.toString();
}
结果:
Str = "3C New 2017 program v1.2.3253.2.5beta52" --> 1.2.3253.2.552
Str = "3C New 2017 program v1.2.3253.2.5 b458" --> 1.2.3253.2.5458