我想通过正则表达式从字符串中提取欧元金额。
目前,我只得到5
的结果,无法理解我的错误。如何找到合适的解决方案来检测字符串中的17,05 Euro
或85 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?
-一个eur
或euro
子字符串。您甚至可以将
[0-9]+(?:[.,][0-9]+)?
简化为[0-9][.,0-9]*
子模式,以匹配数字后跟0+个数字,.
或,
(如果文字写得很好)。