Java Regex将提取欧元金额

时间:2017-07-14 18:33:26

标签: java regex

我想通过正则表达式从字符串中提取欧元金额。

目前我只得到5,因此无法理解我的错误。如何在我的字符串中检测17,05 Euro85 EUR等变体的合适解决方案?

    String regExp = ".*([0-9]+([\\,\\.]*[0-9]{1,})?) *[Eu][Uu][Rr][Oo]? .*";
    Pattern pattern = Pattern.compile(regExp);

    String input1 = "aerae aerjakaes jrj kajre kj 112123 aseraer 1.05 Eur aaa";
    Matcher matcher = pattern.matcher(input1);
    matcher.matches();
    System.out.println(matcher.group(1));

结果:

5

2 个答案:

答案 0 :(得分:2)

您只获得5,因为第一个.*贪婪并且首先抓住整行,然后回溯产生逐个字符,直到后续子模式匹配。这就是为什么只捕获最后一个数字,因为你的模式只需要1个。

您可以使用更简单的模式Matcher#find

String regExp = "(?i)([0-9]+(?:[.,][0-9]+)?)\\s*euro?";
Pattern pattern = Pattern.compile(regExp);
String input1 = "aerae aerjakaes jrj kajre kj 112123 aseraer 1.05 Eur aaa";
Matcher matcher = pattern.matcher(input1);
if (matcher.find()) {
    System.out.println(matcher.group(1));
}

请参阅Java demo

  • (?i) - 不区分大小写的修饰符(无需编写[eE][Uu] ...)
  • ([0-9]+(?:[.,][0-9]+)?) - 第1组:
    • [0-9]+ - 一位或多位
    • (?:[.,][0-9]+)? - 可选序列:
      • [.,] - 文字.,符号
      • [0-9]+ - 一位或多位
  • \\s* - 0+ whitespaces
  • euro? - eureuro子字符串。

如果文字写得很好,您甚至可以将[0-9]+(?:[.,][0-9]+)?缩减为[0-9][.,0-9]*子模式以匹配数字后跟0+数字.,

答案 1 :(得分:0)

替换:

String regExp = ".*([0-9]+([\\,\\.]*[0-9]{1,})?) *[Eu][Uu][Rr][Oo]? .*";
Pattern pattern = Pattern.compile(regExp);

String input1 = "aerae aerjakaes jrj kajre kj 112123 aseraer 1.05 Eur aaa";
Matcher matcher = pattern.matcher(input1);
matcher.matches();
System.out.println(matcher.group(1));

使用:

String regExp = "(?i)\\d*\\.*,*\\d*\\s(euro?)";
Pattern pattern = Pattern.compile(regExp);
String input1 = "aerae aerjakaes jrj kajre kj 112123 aseraer 1.05 Eur aaa";
Matcher matcher = pattern.matcher(input1);
if(matcher.find()) {
    System.out.println(matcher.group(0));

}

这适用于您提供的变体。