如何根据模式正则表达式转换 Java 字符串?

How to convert a Java string against a pattern regex?

我想将组件版本(例如 2.6.0)转换为这种形式 G02R06C00。我认为使用 Java 的正则表达式和模式是可能的,但我没有找到方法。我见过将字符串与模式匹配的示例(在这种情况下,我猜正则表达式是 G\d\dR\d\dC\d\d),但我没有找到如何将字符串转换为具有模式的其他字符串。提前致谢。

我所做的是:

String gorocoVersion = version.replaceAll("(\d*)\.(\d*)\.(\d*)", "GRC");

生成 G2R6C0,但缺少添加 0 以匹配 2 数字。 所以,我之前必须拆分输入字符串,我不能再使用 replaceAll,这就是为什么我一直在寻找更聪明的选项,根据输出模式 [=] 在简单数字之前自动添加 0 15=],就像我们可以在word中找到或excel

一些可以与快照版本一起使用但非常丑陋的东西:

/**
 * @return version in G00R00C00(-SNAPSHOT) format.
 */
private String formatVersion() {
    String gorocoVersion = "";
    if (StringUtils.isNotBlank(version)) {
        String[] versionTab = version.split("\.");
        String partG = String.format("%02d", Integer.parseInt(versionTab[0]));
        String partR = String.format("%02d", Integer.parseInt(versionTab[1]));

        String partC = versionTab[2];
        String snapshotSuffix = "-SNAPSHOT";
        if (partC.endsWith(snapshotSuffix)) {
            partC = String.format("%02d",
                    Integer.parseInt(partC.substring(0, partC.indexOf('-')))) + snapshotSuffix;
        } else {
            partC = String.format("%02d", Integer.parseInt(partC));
        }

        gorocoVersion = "G" + partG + "R" + partR + "C" + partC;
    }
    return gorocoVersion;
}

试试这个方法:

private static String formatVersion(String version) {
    Pattern pattern = Pattern.compile("^(\d+)\.(\d+)\.(\d+)(-SNAPSHOT)*$");
    Matcher matcher = pattern.matcher(version);
    if (matcher.find()) {
        return String.format("G%02dR%02dC%02d", Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)), Integer.parseInt(matcher.group(3)));
    } else {
        throw new IllegalArgumentException("Unsupported version format");
    }
}

version 参数值 2.6.0 的输出:

G02R06C00

非常感谢 Ilya,这是我接受 SNAPSHOT 和 x.y 版本的最终代码:

private String formatVersion(String version) {
    if (StringUtils.isNotBlank(version)) {
        Pattern pattern = Pattern.compile("^(\d+)\.(\d+)\.?(\d+)?(-\w*)?");
        Matcher matcher = pattern.matcher(version);
        if (matcher.find()) {
            return String.format("G%02dR%02dC%02d%s", Integer.parseInt(matcher.group(1)),
                    Integer.parseInt(matcher.group(2)),
                    matcher.group(3) != null ? Integer.parseInt(matcher.group(3)) : 0,
                    matcher.group(4) != null ? matcher.group(4) : "");
        }
    }
    return version;
}

使用此代码 2.6 给出 G02R06C00,2.6.1-SNAPSHOT 给出 G02R06C01-SNAPSHOT,完美:)