如何将 Java 字符串转换为模式正则表达式?

Posted

技术标签:

【中文标题】如何将 Java 字符串转换为模式正则表达式?【英文标题】:How to convert a Java string against a pattern regex? 【发布时间】:2020-04-01 09:48:30 【问题描述】:

我想将一个组件版本(例如2.6.0)转换成这个表单G02R06C00。我认为正则表达式和 Java 模式是可能的,但我不知道如何。我已经看到了将字符串与模式匹配的示例(在这种情况下,正则表达式将是 G\d\dR\d\dC\d\d 我猜),但我不知道如何将字符串转换为具有模式的其他字符串。提前致谢。

我所做的是:

String gorocoVersion = version.replaceAll("(\\d*)\\.(\\d*)\\.(\\d*)", "G$1R$2C$3");

产生G2R6C0,它还缺少添加0 以匹配2 数字。 所以,我之前必须拆分输入字符串,我不能再使用replaceAll,这就是为什么我在寻找更聪明的选项,根据输出模式G\d\dR\d\dC\d\d在简单数字之前自动添加0,就像我们一样可以在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;

【问题讨论】:

我已经编辑了我的问题。 我想知道是否存在将字符串转换为与模式匹配的另一个字符串的函数。我有输入字符串“2.6.0”,我有输出模式“G\d\dR\d\dC\d\d”,但是否有创建与此模式匹配的输出字符串的函数?也就是说G02R06C00 啊,你在找字符串格式。或者,匹配并捕获您的号码,然后使用替换中的反向引用替换(使用String.replaceAll)以指向捕获的号码。 见***.com/questions/37681277/… 是的,我见过 replaceAll,但我正在寻找更聪明的东西,它可以自动将字符串表达式替换为输出模式,并在简单数字前自动添加 0,这要归功于输出模式 "G\d \dR\d\dC\d\d"。根据您的回复,我所做的是: String gorocoVersion = version.replaceAll("(\\d*)\\.(\\d*)\\.(\\d*)", "G$1R$2 3 加元");产生 G2R6C0,它还缺少添加 0 来匹配 2 位数字 【参考方案1】:

试试这个方法:

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

【讨论】:

太棒了!谢谢,我正在尝试调整您的代码,以便在最后使用 -SNAPSHOT 我已经更新了表达式,现在可以使用-SNAPSHOT 后缀了。如果你想用这个后缀添加或做其他事情,使用匹配器的组 4。 是的,如您所见,我已在其他消息中更新了我的代码。谢谢你,伊利亚 :)【参考方案2】:

非常感谢 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,完美:)

【讨论】:

以上是关于如何将 Java 字符串转换为模式正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

如何转换使用 Lookahead 的正则表达式模式?

如何将 javascript 正则表达式转换为安全的 Java 正则表达式?

将java字符串转换为与replaceAll中的正则表达式兼容的字符串[重复]

Java 正则表达式将字符串转换为有效的 json 字符串

如何使用 Python 将任何字符串转换为有效的自定义模式?

使用正则表达式将十六进制转换为ascii