我有:"The price is 1 000$ another pice 34 000 , 00 EUR. You have to pay 1400 EUR, and you have to pay extra 2000$"
。我想要的是?我想要价格,但如果在价格之前是“支付”或“支付额外”,那么我必须拒绝这个价格。我有正则表达式给我价格,所以它很棒,但我认为我需要另一个?或者修改在价格是特定字之前拒绝某些价格的正则表达式。我的示例输出应为:1000,34000
我的代码:
String regex = "(([0-9]+[\\s,.]*)+)(\\$|EUR)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
price = matcher.group();
if (price.contains(",")) {
price = price.substring(0, price.indexOf(","));
}
price = price.replaceAll("\\s", "").replaceAll("[^0-9]+", "");
if (price.contains(",")) {
price = price.replaceAll("\\,", "");
} else {
price = price.replaceAll("\\.", "");
}
它给了我:
1000,34000,1400,2000
但我只想:1000,34000
我必须拒绝接受“支付”和“额外支付”字样的价格。
编辑:“。”是这样的价格1 000. 00
答案 0 :(得分:2)
我知道你有字符串,其中小数点分隔符是逗号,点是数字分组符号。
您可以将pay
或pay extra
字词作为可选捕获组(\\bpay(?:\\s+extra)?\\s*)?
进行匹配,并检查该组是否匹配。如果是,则应丢弃该匹配,否则,抓取该号码并删除,
及其后的数字。然后,只需删除所有非数字符号。
请参阅Java demo:
String text = "The price is 1 000$ another pice 34 000 , 00 EUR. You have to pay 1400 EUR, and you have to pay extra 2000$";
String regex = "(\\bpay(?:\\s+extra)?\\s*)?(\\d[\\d\\s,.]*)(?:\\$|EUR)";
Pattern pattern = Pattern.compile(regex);
Matcher m = pattern.matcher(text);
List<String> res = new ArrayList<>();
while (m.find()) {
if (m.group(1) == null) {
res.add(m.group(2).replaceAll(",\\s*\\d+|\\D", ""));
}
}
System.out.println(res);
// => [1000, 34000]
模式详情:
(\\bpay(?:\\s+extra)?\\s*)?
- 一个可选的捕获组,匹配整个单词pay
或pay extra
(中间有任意1个空格),然后是0 +空格(当组不匹配时, matcher.group(1)
null )(\\d[\\d\\s,.]*)
- 第2组:一个数字,然后是0+数字,空格,,
或/和.
符号(?:\\$|EUR)
- 与$
符号或EUR
子字符串匹配的非捕获组。 ,\\s*\\d+|\\D
模式匹配,
,0 +空格和1+数字或任何非数字符号。
注意:如果您可以将 .
和,
作为小数点分隔符,则在最后正则表达式,将,
替换为[,.]
。请参阅this Java demo。
答案 1 :(得分:1)
我会采用以下方法。
首先,我会删除空格,因为它们不会引入我们在解析时需要考虑的任何有价值的信息。
然后我会用小数分隔符替换它以使它更常见。
现在让我在代码中显示:
String parsePrices(String input){
StringBuilder result = new StringBuilder();
String preprocessedInput = input.
replaceAll("\\s", "").
replaceAll("(\\d)(\\,)(\\d)", "$1\\.$3");
Pattern p = Pattern.compile("(?<!pay|payextra)((?<=[^\\d])\\d+\\.?\\d+)(\\$|EUR)");
Matcher m = p.matcher(preprocessedInput);
while(m.find()){
result.append(String.format("%.0f", Double.parseDouble(m.group(1)))).append(",");
}
return result.toString().substring(0, result.length()-1);
}
其中:
replaceAll()
删除了空格replaceAll()
更改小数点分隔符negative-look-behind
方法来排除pay或payextra之后的过程String.format("%.0f", Double.parseDouble(m.group(1)))
可让您调整价格的精确度。