bri*_*ium 12 java regex versioning
我有一个与设备固件通信的应用程序.由于固件有变化,因此会使用该格式进行版本控制{major}.{minor}.{revision}[beta[{beta}]].为了给你举几个例子,当前的版本0.4.7beta将随后出现0.4.7beta2,偶尔会0.4.7出现0.4.8beta.遗憾的是,固件的版本控制格式不在我的控制之下,所以我无法更改它.
我需要一种相互比较固件的方法.基本上,我需要一个功能
boolean isFirmwareNewer(String testFW, String baseFW);
Run Code Online (Sandbox Code Playgroud)
到目前为止我所做的是将这种格式转换为简单格式int.因此0.4.7beta2将成为00040702(每个级别2位数).问题是,那
0.0.0更新的通配符0.4.7beta2并不比新版本更新0.4.7).这很容易解释(if (testFW.contains("beta")) testFWValue -= 100;但它也不是很优雅.你们这些人是如何正常做的(或者你们会怎么做)?
如果你愿意,我可以附上我目前使用的代码,但正如我所说,它是> 40行代码而不是真正可读(这就是我寻找更好的方法来实现这一目的的原因).
aio*_*obe 20
这是一个建议:
static int[] getVersionNumbers(String ver) {
Matcher m = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)(beta(\\d*))?")
.matcher(ver);
if (!m.matches())
throw new IllegalArgumentException("Malformed FW version");
return new int[] { Integer.parseInt(m.group(1)), // major
Integer.parseInt(m.group(2)), // minor
Integer.parseInt(m.group(3)), // rev.
m.group(4) == null ? Integer.MAX_VALUE // no beta suffix
: m.group(5).isEmpty() ? 1 // "beta"
: Integer.parseInt(m.group(5)) // "beta3"
};
}
static boolean isFirmwareNewer(String testFW, String baseFW) {
int[] testVer = getVersionNumbers(testFW);
int[] baseVer = getVersionNumbers(baseFW);
for (int i = 0; i < testVer.length; i++)
if (testVer[i] != baseVer[i])
return testVer[i] > baseVer[i];
return true;
}
Run Code Online (Sandbox Code Playgroud)
它使用一个小技巧并将beta部分翻译如下:
"" (没有beta后缀)→Beta MAX_INT"beta" →Beta 1(因为它在"beta2"之前)"betaX" →Beta X.请注意,true如果两个版本相同,则返回.
我会实现一个类似的类:
class Version implements Comparable<Version> {
int major;
int minor;
int rev;
int beta = Integer.MAX_VALUE;
public int compareTo(Version o) {
if (this.major != o.major) {
return Integer.compare(this.major, o.major);
}
if (this.minor != o.minor) {
return Integer.compare(this.minor, o.minor);
}
if (this.rev != o.rev) {
return Integer.compare(this.rev, o.rev);
}
if (this.beta != o.beta) {
return Integer.compare(this.beta, o.beta);
}
return 0;
}
public static Version parse(String version) {
// TODO: implement parsing here
// 1.1.1 - beta = MAX_VALUE
// 1.1.1beta - beta = 1
// 1.1.1beta2 - beta = 2
return new Version();
}
@Override
public String toString() {
return "" + major + "." + minor + "." + rev
+ (beta == Integer.MAX_VALUE ? ""
: (beta == 1 ? "beta" :
("beta" + beta)));
}
}
Run Code Online (Sandbox Code Playgroud)
然后以标准的java方式进行比较:
if (Version.parse(testFW).compareTo(Version.parse(baseFW)) < 0) {
// Version is newer!
}
Run Code Online (Sandbox Code Playgroud)