具有多个匹配的正则表达式不起作用

时间:2018-02-27 15:03:12

标签: java regex

我有以下正则表达式:

((?i:EUR)( ?)(([0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?)|([0-9]{1,3}(\.[0-9]{3})*(,[0-9]+)?)|((\d+)((\.|,)\d+)?))( ?)(?i:Mio|Million|Billion)?)

使用正则表达式我想搜索所有类型的数字。数字可能包含数千个英文分隔符,其中包含","或者用德语作为"。"。十进制数也是可能的(Englisch:"。"德语:",")。

到目前为止,我的正则表达式有效。只有一个问题。例如:

  该公司2016年的销售额为1.000.000,5欧元

比赛是:

  

该公司2016年产生了MATCH.000,5的销售

问题是正则表达式([0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?)的第一部分已经匹配,尽管第二部分([0-9]{1,3}(\.[0-9]{3})*(,[0-9]+)?)包含更好的解决方案。

目前,我正试图在正则表达式的第一部分之后,在(^\.(?=[0-9]))

的第一部分之后,在正向前瞻([0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?)(^\.(?=[0-9]))的帮助下解决此问题。

总之:((?i:EUR)( ?)(([0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?)(^\.(?=[0-9]))|([0-9]{1,3}(\.[0-9]{3})*(,[0-9]+)?)|((\d+)((\.|,)\d+)?))( ?)(?:Mio|Million|Billion)?)

但不是

  

该公司2016年的销售额为1,000,000.5欧元

有以下匹配:

  

该公司2016年产生了MATCH,000.5的销售

有没有人知道在这种情况下如何使用正面或负面的前瞻,以便解决这两个问题?

2 个答案:

答案 0 :(得分:1)

regex101后使用预测以确保该号码包含至少两个,或两个.

((?i:EUR)\s?
  (?:
    (?=(\d*,){2})[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?
  |
    (?=(\d*\.){2})[0-9]{1,3}(\.[0-9]{3})*(,[0-9]+)?
  |
    \d+(?:[.,]\d+)?
  )
\s?(?i:Mio|Million|Billion)?)

java代码

String in = "the company generated sales of EUR 1.000.000,5 in 2016";
Pattern p = Pattern.compile(
    "((?i:EUR)\\s?(?:(?=(\\d*,){2})\\d{1,3}(,\\d{3})*(\\.\\d+)?|(?=(\\d*\\.){2})\\d{1,3}(\\.\\d{3})*(,\\d+)?|\\d+(?:[.,]\\d+)?)\\s?(?i:Mio|Million|Billion)?)" );
Matcher m = p.matcher( in );
while ( m.find() ) {
    System.out.println( m.group( 1 ) );
}

答案 1 :(得分:0)

也许:^([0-9]{0,3}((\,|\.)[0-9]{3})*)((\,|\.)[0-9]*){0,1}