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;
。
我们得到 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;
。