有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

正则表达式Java可以删除除“.”以外的所有字符双倍/浮动的数字是多少?

我试图解决一个小问题,它是代码的一部分,基本上通过版本文件检查其他机器上的版本。它查看这些文件的名称,并删除当前所有字符

起初,我试着:

private String getLatestVerFile( List<String> verFiles ) {

    String latestVerFile = null;
    long lastMod = Long.MIN_VALUE;

    for (String file : verFiles ) {

        if ( Long.parseLong( file.replaceAll( "[^0-9]", "" ) ) > lastMod ) {
            latestVerFile = file;
            lastMod = Long.parseLong( file.replaceAll( "[^0-9]", "" ) );
        }
    }

    return latestVerFile;       
}

这里的问题是给定了多个版本文件,这意味着要返回最新的版本文件,在某些情况下不会:

ex:
R9.10 = 910
R9.26_P1 = 9261
R9.01 = 901
R10.1 = 101

在这种情况下,R10。1将是最新版本

就我个人而言,我希望他们采用更标准、更直接的版本编号方案,但这超出了我的控制范围

我的想法是把它当作替身处理。我想您可以使用[^0-9]根据一些谷歌搜索,如下所示

private String getLatestVerFile( List<String> verFiles ) {

    String latestVerFile = null;
    double lastMod = Double.MIN_VALUE;

    for (String file : verFiles ) {

        if ( Double.parseDouble( file.replaceAll( "[^0-9.]", "" ) ) > lastMod ) {
            latestVerFile = file;
            lastMod = Double.parseDouble( file.replaceAll( "[^0-9.]", "" ) );
        }
    }

    return latestVerFile;       
}

也就是说,它不起作用。我想可能是因为文件名是R9。比如说,10.5版本,它可能会以“9.10”的形式出现试着把它变成双倍。一位同事说他使用R(\d+。\d+)(\u P\d+1)。但是我不知道从哪里开始,或者它如何知道从字符串中过滤出什么

目标是实现以下目标:

ex:
R9.10 = 9.10
R9.20_P1 = 9.201
R10.11 = 10.11
R10.20_P1 = 10.201

但我特别想知道如何才能做到这一点。劝告我想我的部分问题是,老实说,我不太理解正则表达式,以及如何选择要忽略的模式部分


共 (1) 个答案

  1. # 1 楼答案

    我想说,忘记使用Double(release number是而不是浮点数),创建自己的类似类release number:

    //details left out for brevity
    public class ReleaseNumber implements Comparable<ReleaseNumber> {
        private final int majorVersion;
        private final int minorVersion;
    }
    

    然后,您可以使用正则表达式从每个字符串中获取发布号字段:

    //...
    List<String> fileNames /* = ... */;
    
    String latestVersionFileName = Collections.max(fileNames, new Comparator<String>() {
        public int compare(String file1, String file2) {
            return getReleaseNumberFromFileName(file1)
                     .compareTo(getReleaseNumberFromFileName(file2));
        }
    }
    
    //...
    
    Pattern releaseNumberPattern = Pattern.compile("(\\d+)\\.(\\d+)");
    
    public ReleaseNumber getReleaseNumberFromFileName(String fileName) {
        Matcher releaseNumberMatcher = releaseNumberPattern.matcher(fileName);
        if (releaseNumberMatcher.find()) {
            int majorVersion = Integer.parseInt(releaseNumberMatcher.group(1));
            int minorVersion = Integer.parseInt(releaseNumberMatcher.group(2));
            ReleaseNumber version = new ReleaseNumber(majorVersion, minorVersion);
            return version;
        }
        throw new RuntimeException();
    }
    

    在本例中,我们只使用一个简单的正则表达式\d+\.\d+,它表示“一个或多个十进制数字,后跟一个点,后跟一个或多个十进制数字”,并搜索文件内容以查找该模式的第一次出现