从字符串中删除无效的数字字符

问题描述 投票:2回答:3

我通过删除所有非数字字符并保持点“。”来比较版本字符串。

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());
            }
        }
    }
android regex char hashset
3个回答
1
投票

试试这个

/([\d]+\..*?[^a-zA-Z]*)/g

这是正则表达式101演示https://regex101.com/r/GCs7mb/3

  • 第一个捕获组([\ d] + ..?[^ a-zA-Z])匹配下面列表中的单个字符[\ d] + 量词 - 在一次和无限次之间匹配,尽可能多次,根据需要返回(贪婪)\ d匹配一个数字(等于[0-9])。匹配角色。从字面上看(区分大小写)。*?匹配任何字符(行终止符除外)?量词 - 在零和无限时间之间匹配,尽可能少,根据需要进行扩展(懒惰)匹配下面列表中不存在的单个字符[^ a-zA-Z] 量词 - 在零和无限次之间匹配,尽可能多次,根据需要(贪婪)回报a(索引97)和z(索引122)之间的范围内的单个字符(区分大小写)AZ中的单个字符A(索引65)和Z(索引90)之间的范围(区分大小写)全局模式标志g修饰符:全局。所有比赛(首场比赛后不返回)

1
投票

为什么不尝试这个

/(\d+\.)+\d+[a-z]*\d*/g

匹配任何x。 1次或更多次后跟数字这样,如果它们遵循x.x格式,将提取出所有版本

这将返回带有'beta'的版本然后您可以在该字符串上使用另一个正则表达式来排除非法beta

/[^a-z]/g

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
© www.soinside.com 2019 - 2024. All rights reserved.