2016-09-30 74 views
0

我有包含字符串几个浮子(或整数)编号加上随机的东西在开始和结束时。我想要一个只匹配包含至少给定数量的float的字符串的正则表达式,并将第一个给定数量的float值报告为一个组。正则表达式匹配浮点数的确切数目

例子: 假设该字符串必须包含6浮点数。请记住,每个字符串在开始和结束时都包含随机内容,因此无法使用$^

5.13e12 4.5774 4.743E-1 .655E3    NO MATCH (only 4 float) 
5.13e12 4.5774 4.743E-1 .655E3 1 2   MATCH (6 float -> all in 1 group) 
5.13e12 4.5774 4.743E-1 .655E3 1 2 3 5 6  MATCH (6 first float in a group) 

直到现在我阐述了以下

((\s*\d*\.?\d+[Ee]?[+-]?\d*){6}) 

,但是这其中也匹配行少于6个浮点数。

编辑:经过多次测试,正则表达式更接近我想要的是@Sebastian Proske。但是,当我尝试匹配9浮动电脑失速。看看周围似乎这是由于正则表达式试图匹配任何可能的组合使用+和*形成的事实。你有什么想法如何使这成为可能?

+0

你的模式将包括当前6位数字,任何行匹配由于分离器( '\ s')是可选的。你可以试试'(?:\ d * \。?\ d + [Ee]?[+ - ]?\ d *)(\ s +(?:\ d * \。?\ d + [Ee]?[+ - ] ?\ d *)){5}' –

+0

或者['^ \ d * \ \ d + [EE] [+ - 。?????] \ d *(?: + \ d * \ \ d + [EE] ?[+ - ]?\ d *){5}'](https://regex101.com/r/hCO1kJ/2)。 –

+0

@SebastianProske您的评论有帮助:如果我只是把'\ s +'而不是'\ s *'在我的正则表达式中有效。基本上是以下...'\ S *((\ d * \ \ d + [EE] [+ - ]???\ d * \ S +){6})' –

回答

0

此正则表达式与otional组应该为你工作在每一行匹配至少6个号码:

(?:[+-]?\d*\.?\d+(?:E[+-]?\d+)?(?:\s+|$)){6} 

RegEx Demo

+0

我被要求符合我的字符串时,它是在一些其他的东西中间的东西... –

+0

OK,然后只是删除''^从正则表达式,使其在任何地方匹配。在答案中查看更新的演示 – anubhava