我想通过正则表达式从字符串中提取欧元金额。
目前我只得到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
答案 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?
- eur
或euro
子字符串。如果文字写得很好,您甚至可以将[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));
}
这适用于您提供的变体。