gpt4 book ai didi

java - 正则表达式以确保字符串包含不超过一个数字

转载 作者:行者123 更新时间:2023-12-02 08:13:29 25 4
gpt4 key购买 nike

我想检查一个字符串是否只包含一个数字,如果它包含多个数字则抛出异常:

(D*?\d+\D+\d+D*)

private static void assertOnlyOneNumber(String input) {
if (input.matches(("(D*?\\d+\\D+\\d+D*)"))) {
throw new RuntimeException(
"Assertion failed! String contains more than a single number: "
+ input);
}
}

所以,例如以下应该匹配并抛出异常:

  • 42'12
  • 1 小时 22 分钟
  • 01:23:22
  • 大约 120 分钟、200 分钟、300 分钟

以下不应匹配,因此被视为有效:

  • 12 分钟
  • 141'
  • 大约 22 分钟

看来我的正则表达式运行正常,但很容易出错,因此我的问题。

背景:基本上我进行了从字符串字段到整数字段的转换,我将字符串字段解释为以分钟为单位的持续时间。因此,我首先运行此检查以确保字符串中的数字不超过一个,然后我剥离一组固定的已知标记(如“分钟”、“分钟”等),最后尝试通过Integer.parseInt() 如果我可以转换它。

如果是,我得到我的持续时间(以分钟为单位),否则我抛出异常。

最佳答案

如果您想将 if 保留在一行中,您仍然可以将正则表达式简化为 .*\\d\\D+\\d.*

不过,进行多项检查可能更容易,尤其是如果您想将其更改为“不超过 x 个数字”:

Matcher m = Pattern.compile("\\d+").matcher(input);
for (int i = 0; i < allowedNumber; i++)
m.find();
if (m.find())
throw new RuntimeException(...);

两种方式的合并是根据允许出现的次数构造正则表达式:

String regex = Stream.generate(() -> "\\d+").limit(allowedNumber + 1).collect(joining("\\D+", ".*", ".*"))

// non-stream equivalent
String regex = ".*\\d+";
for (int i = 0; i < allowedNumber; i++) {
regex += "\\D+\\d+";
}
regex += ".*";

if (input.matches(regex)) {
throw new RuntimeException(...);
}

关于java - 正则表达式以确保字符串包含不超过一个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44047606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com