我有以下正则表达式:
((?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的销售
有没有人知道在这种情况下如何使用正面或负面的前瞻,以便解决这两个问题?
答案 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}