我需要从给定的文本行中提取价格信息。到目前为止,我已经用以下java正则表达式(\\d{1,3}(,\\d{3})*(\\.\\d+)?)
成功地处理了像price will be 90,500 USD
这样的行。
但现在,我也有一些行在价格之前还有另一个数字(例如:对于订单号码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,456和123,456.56应该匹配。问题是,我的当前代码从123456、123-456和A123456中提取了123。
Pattern.compile(".*\\D(\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)?)")
获取最后一个匹配。返回m.group(1)
。 - Wiktor Stribiżew(\\d{1,3}(?:,\\d{3})*(\\.\\d+)?) USD\\b
,因为你正在使用一个捕获组来匹配价格。https://regex101.com/r/xTJBeX/1 - The fourth birdPattern.compile("\\d{1,3}(?:,\\d{3})+(?:\\.\\d+)?")
?请参见 https://regex101.com/r/mtLNLb/1 - Wiktor StribiżewPattern.compile("\\b\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)?\\b")
。 - Wiktor Stribiżew