我通过删除所有非数字字符并保留点“.”来比较版本字符串
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());
}
}
}
最佳答案
试试这个
/([\d]+\..*?[^a-zA-Z]*)/g
这是正则表达式 101 演示 https://regex101.com/r/GCs7mb/3
- 第一个捕获组 ([\d]+..?[^a-zA-Z]) 匹配单个字符
出现在下面的列表中 [\d]+
- 量词 - 匹配一次和无限次,尽可能多的次数,根据需要返回(贪婪)\d 匹配一个数字(等于 到 [0-9]) 。匹配字符。字面上(区分大小写).*? 匹配任何字符(行终止符除外) ?量词 - 匹配次数为零到无限次,尽可能少的次数,根据需要扩展(惰性) 匹配单个 以下列表中不存在的字符 [^a-zA-Z]
- 量词 - 匹配次数为零到无限次,尽可能多的次数,根据需要(贪婪)返回 a-z 单个 a(索引 97)和 z(索引 122)之间范围内的字符(case 敏感)A-Z A 之间范围内的单个字符(索引 65) 和 Z(索引 90)(区分大小写)全局模式标志 g 修饰符: 全局的。所有比赛(第一场比赛后不返回)
关于android - 从字符串中删除无效的数字字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47960809/