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

目前,我只得到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

最佳答案

您只会得到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]+-1个或多个数字
(?:[.,][0-9]+)?-可选序列:


[.,]-文字.,符号
[0-9]+-1个或多个数字


\\s*-0+空格
euro?-一个eureuro子字符串。


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

09-26 12:10