2017-07-14 179 views
1

我想通過正則表達式從字符串中提取歐元金額。Java正則表達式提取歐元金額

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

+0

檢查[this](https://stackoverflow.com/a/37571199/2064981)。可以幫助你;)在[regex101](https://regex101.com/r/kL8pD9/7)修改。 – ClasG

+0

'。*?'非貪婪且無需轉義',''在'[]' –

回答

3

你只有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? - a eureuro子串。

你甚至可以降低到[0-9]+(?:[.,][0-9]+)?子模式[0-9][.,0-9]*匹配一個數字,然後用0+數字,.,如果文本寫得好。

1

替換:

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)); 

} 

本工程爲您提供的變種。