我试图解决一个小问题,它是代码的一部分,基本上通过版本文件检查版本与其他机器上的版本。它会查看这些文件的名称,并删除当前的所有字符。
起初,我试过了:
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
但我特别坚持如何完成这项工作。建议吗?我想我的一部分问题是我老实说不是很好地理解正则表达式,以及如何选择忽略模式的哪些部分。
答案 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+
,意思是“一个或多个十进制数字,后跟一个点,后跟一个或多个十进制数字”,我们搜索第一个文件内容这种模式的出现。