【问题标题】:java - Fix an invalid Durationjava - 修复无效的持续时间
【发布时间】:2017-06-22 00:30:40
【问题描述】:

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

感谢任何建议

【问题讨论】:

  • 删除前面没有数字的字母(同样除了P和T)不是更正确吗?并不是说它在实践中有什么不同。

标签: java sed duration


【解决方案1】:

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

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

这会产生

PT10H0M0S

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

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

现在我明白了

PT10H

Duration.parse(dur) 在这两种情况下都能正常工作并给出预期的结果。

(?&lt;!\\d+) 是一个否定的lookbehind:只有当 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;

【讨论】:

  • 我喜欢去掉没有数字的字母,但这不起作用,因为对于值 PTHMS,它留下了无效的 PT。我想我可以对此进行测试并替换它,但是用于插入 0 的正则表达式运行良好,所以我正在使用它谢谢!有一天,我将不得不阅读一些正则表达式。
  • 好点!我想我考虑过这种可能性,但后来忘记在答案中写下它,对不起。 @凯文
猜你喜欢
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
相关资源
最近更新 更多