使用不一致的换行符从文本中提取数字

时间:2015-10-10 14:53:16

标签: regex

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

${hasErrors(model: flash?.userInstance, field: 'fullName', 'error')}

这个正则表达式正常运行:

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

请注意在符号之后或数字之间随机插入换行符,就像系统存储值而不过滤换行符一样。

我正在努力解决这个问题。我尝试了各种表达,但我更成功的是[0-9,.-] [\ n] {0,1} [0-9,.-] [] {0,1}匹配个人号码。

我可以使用什么表达式来匹配数字格式的两种变体,最好是已经剥离出不定的换行符?

更新:使用     [ - \ n] {0,2} [0-9,] + [\ n.0-9] {3,4} [\ n] {0,1} 如果我有更好的方式,请告诉我

1 个答案:

答案 0 :(得分:2)

一种方法是写出数字构成的精确表示,所以在你的情况下[-+]?[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个数字的元组。以下是一个示例:https://regex101.com/r/jD5nT8/1