gpt4 book ai didi

java - 正则表达式区分千位分隔数与非千位分隔数

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:44:51 24 4
gpt4 key购买 nike

我需要在给定的文本行中提取价格信息。到目前为止,我在 Java 中成功地使用了以下正则表达式 (\\d{1,3}(,\\d{3})*(\\.\\d+)?) ,行如下 价格为 90,500 美元

但是,现在我也有价格开始前有另一个数字的行 (例如:对于订单号 12345,价格将为 100,500 美元)。在这种情况下,我的价格提取失败了。例如,上面将给我 123 作为结果。

我能否使用正则表达式/另一种方法来仅提取价格信息,而不管是否存在其他数字? (价格将始终以千位分隔,带或不带小数点)

下面是我现在用于这项工作的完整代码:

private String getPrice(String fileText) {
String lines[] = fileText.split(System.lineSeparator());

for (String line : lines) {
Pattern p = Pattern.compile("(\\d{1,3}(,\\d{3})*(\\.\\d+))");
Matcher m = p.matcher(line);
if (m.find()) {
return m.group(0);
}

p = Pattern.compile("(\\d{1,3}(,\\d{3})*(\\.\\d+)?)");
m = p.matcher(line);
if (m.find()) {
return m.group(0);
}
}
return "";
}

我希望匹配是单词级别的。 (例如:12345 中的 123 不应匹配。) 我的单词分隔符仅为 空格123-456 被认为是一个单词。所以只有 123456, 123-456, 123,456, 123,456.56, A123456 123,456123,456.56 应该匹配。问题是我当前的代码提取 123 of 123456123-456A123456

最佳答案

您的正则表达式匹配任何上下文中的数字,小数部分是必需的。

我建议:

  • 只匹配不包含单词字符的数字
  • 在分数部分模式周围使用可选的非捕获组。

使用

Pattern p = Pattern.compile("\\b\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)?\\b");

参见 regex demo .

\b 模式是字边界和 (?:...)?(?:\\.\\d+)? 是非捕获组,重复一次或零次,即可选。

关于java - 正则表达式区分千位分隔数与非千位分隔数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56107665/

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