从字符串

时间:2017-12-24 13:00:25

标签: android regex char hashset

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

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());
            }
        }
    }

3 个答案:

答案 0 :(得分: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-z一个 a(索引97)和z(索引122)之间的范围内的字符(case 敏感)A-Z A之间的单个字符(索引65) 和Z(索引90)(区分大小写)全局模式标志g修饰符: 全球。所有比赛(首场比赛后不返回)

答案 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