Regex 从具有不一致换行符的文本中提取数字

Regex 从具有不一致换行符的文本中提取数字,regex,Regex,我有6个数字的文本通常存储在一行中 SomeData\n0.00 0.00 0.00 31,570.07 0.00 31,570.07\nSomeData SomeData\n0.00 0.00 0.00 485,007.24 0.00 485,007.24\nSomeData 这个正则表达式在它上面工作得很好: \n[0-9,.-]* [0-9,.-]* [0-9,.-]* [0-9,.-]* [0-9,.-]* [0-9,.-]*\n 我注意到,每隔一段时间我就会看到: SomeData

我有6个数字的文本通常存储在一行中

SomeData\n0.00 0.00 0.00 31,570.07 0.00 31,570.07\nSomeData
SomeData\n0.00 0.00 0.00 485,007.24 0.00 485,007.24\nSomeData
这个正则表达式在它上面工作得很好:

\n[0-9,.-]* [0-9,.-]* [0-9,.-]* [0-9,.-]* [0-9,.-]* [0-9,.-]*\n
我注意到,每隔一段时间我就会看到:

SomeData\n0.00 0.00 10,921,594\n.89\n-\n9,563,271.0\n6\n0.00 1,358,323.83\nSomeData
请注意,换行符是如何在符号后或数字之间随机插入的,就好像系统存储值而不过滤换行符一样

我正在努力把这个提取出来。我尝试了各种表达式,但更成功的是[0-9,.-][\n]{0,1}[0-9,.-][{0,1}来匹配单个数字

我可以使用什么表达式来匹配数字格式的两种变化,最好是已经去掉了不恒定的换行符

更新:继续进行 [-\n]{0,2}[0-9,]+[\n.0-9]{3,4}[\n]{0,1}
请告诉我是否有更好的方法

一种方法是写出数字的精确表示形式,因此在您的情况下,
[-+]?[0-9]+[0-9,]*(?:\.[0-9]+)?
就可以了。这很有帮助,因为这样你的搜索就可以知道一个数字什么时候开始,什么时候结束(因为有这样的规则:一个符号总是在开头,一个点不能出现多次,等等)。然后您希望匹配由新行或空格分隔的六对,因此将其包装在捕获组中,并限制为6:
(…[\n]*){6,6}
。这有助于,因为正则表达式引擎可以通过回溯什么来考虑一个数字,通过知道它应该匹配多少来计算出来。然后,您希望在几乎任何位置都允许新行,因此请在每个角色组中放置新行。您可能还希望在两侧锚定数字,但这不是必需的,因为现在正则表达式引擎将尝试识别6个数字的有效元组。最终结果是:

SomeData\n([-+]?[0-9\n]+[0-9,\n]*(?:\.[0-9\n]+)?[ \n]){6,6}SomeData

这将找到6个数字的元组,无论输入在哪里。这里有一个例子:

你必须弄清楚为什么会有这些“虚假”的新行,或者至少确定一个非常独特的模式,你可以忽略它们或者消除它们。如果数字的模式是完全可区分的,而不管换行符是什么,那么可能会“忽略”数字模式——例如,与所有其他SomeData是可区分的。谢谢Jeff。大多数模式如下所示。目前在[-\n]{0,2}[0-9,.]*[\n]*[0-9]*