java - 修复无效的持续时间

java - Fix an invalid Duration

我们得到 xml 的持续时间无效,例如 PT10HMS(注意 M 和 S 之前缺少数字)。我通过读取文件并通过逐个字符地迭代持续时间字符串并在并排的 2 个字母(P 和 T 之间除外)之间插入 0 来解决这个问题。我想知道是否有更优雅的解决方案,可能是将正则表达式与 sed 或其他任何东西一起使用?

感谢任何建议

这里有一个 Java 解决方案的想法(当然 sed 也可以使用)。

    String incorrectDuration = "PT10HMS";
    String dur = incorrectDuration.replaceAll("(?<!\d+)[HMS]", "0[=10=]");

这会产生

PT10H0M0S

我个人更喜欢删除前面没有数字的字母:

    String dur = incorrectDuration.replaceAll("(?<!\d+)[HMS]", "");

现在我明白了

PT10H

在这两种情况下,Duration.parse(dur) 都有效并给出了预期的结果。

(?<!\d+) 是一个负向后视:只有当 H、M 或 S 前面没有数字串时,正则表达式才匹配。

编辑: 我可能在下面做得太过了。我只是很好奇,如果您在评论中提到 PTHMS ,我如何也可以生成我喜欢的字符串。对于生产代码,您可能希望坚持使用上面更简单的解决方案。

    String durationString = "PTHMS";
    // if no digits, insert 0 before last letter
    if (! durationString.matches(".*\d.*")) {
        durationString = durationString.replaceFirst("(?=[HMS]$)", "0");
    }
    // then delete letters that do not have a digit before them
    durationString = durationString.replaceAll("(?<!\d)[HMS]", "");

这会产生

PT0S

(?=[HMS]$) 是前瞻性的。它匹配空字符串,但前提是此空字符串后跟 H、M 或 S,然后是字符串的结尾。所以用 0 替换这个空字符串给我们 PTHM0S。确信字符串中现在至少有一位数字,我们可以继续删除前面没有数字的字母。

如果你只有 PT 还是行不通的。据我了解,这不会发生。如果是这样,您更喜欢在 if 语句中使用例如 durationString = PT0S;