在特定单词之前拒绝价格,正则表达式java

时间:2017-07-31 12:03:25

标签: java regex

我有:"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

2 个答案:

答案 0 :(得分:2)

我知道你有字符串,其中小数点分隔符是逗号,点是数字分组符号。

您可以将paypay 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*)? - 一个可选的捕获组,匹配整个单词paypay 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()删除了空格
  • second replaceAll()更改小数点分隔符
  • 正则表达式使用negative-look-behind方法来排除pay或payextra之后的过程
  • String.format("%.0f", Double.parseDouble(m.group(1)))可让您调整价格的精确度。