Java - 可以删除除“。”之外的所有字符。和双/浮点数?

时间:2011-09-20 21:25:36

标签: java regex replaceall

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

起初,我试过了:

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。]进行Google搜索,如下所示。

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.ver,例如,它可能是“9.10”。并试图使它成为一个双倍。同事说使用R(\ d +。\ d +)(_ P \ d + 1)。但是,我不知道从哪里开始,或者它如何知道要从字符串中过滤掉什么。

目标是得到这个:

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

但我特别坚持如何完成这项工作。建议吗?我想我的一部分问题是我老实说不是很好地理解正则表达式,以及如何选择忽略模式的哪些部分。

1 个答案:

答案 0 :(得分:4)

我会说忘记使用Double(版本号浮点数 )并创建一个名为ReleaseNumber的可比类:

//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+,意思是“一个或多个十进制数字,后跟一个点,后跟一个或多个十进制数字”,我们搜索第一个文件内容这种模式的出现。