regex 正则表达式匹配数字列表

eoxn13cs  于 2023-05-30  发布在  其他
关注(0)|答案(4)|浏览(198)

我正在尝试编写一个正则表达式来匹配一个由逗号和可选空格分隔的非常长的数字列表。它不能匹配单个整数。数字列表大约有7000字节长,两边都有文本。

12345 => don't match
12345,23456,34567,45678 => match
12345, 23456, 34567, 45678 => match

我的当前正则表达式

(?<!\.)(([0-9]+,)+[0-9]+)(?!\.)

导致堆栈溢出。到目前为止,我尝试过的几个是:

([0-9,]+) => doesn't match with optional spaces
((\d+,[ ]?)+\d+) => worse than the original
[ ]([0-9, ]+)[ ] => can't be certain the numbers will be bounded by spaces

我使用https://regex101.com/来测试每个正则表达式所需的步骤数,原始的是大约3000步。
示例(省略)字符串:

Processing 145363,145386,145395,145422,145463,145486 from batch 59

任何帮助将不胜感激。

9ceoxa92

9ceoxa921#

你可以使用这个正则表达式:

^\d+(?:[ \t]*,[ \t]*\d+)+$

RegEx Demo

  • \d+匹配1个或多个数字
  • (?:...)+匹配下列数字中的一个或多个,这些数字之间用逗号分隔,可以用空格/制表符包围。
e7arh2l6

e7arh2l62#

(\d+,\s*)+\d+

\d+,\s*匹配所有带有逗号后跟空格/无空格的数字。然而,我们需要注意最后一个没有“,”的数字,就像上面的组一样。最后一个数字是\d+

avwztpqn

avwztpqn3#

不如

(?:\d+,\s*)+\d+

细分:

(?:         # begin group
  \d+       #   digits
  ,\s*      #   ",", optional whitespace
)+          # end group, repeat
\d+         # digits (last item in the list)

请注意,\s除了空格和制表符外还包括空格字符,最明显的是换行符(\n)。如果您的输入需要,请使用[ \t]代替\s以防止误报。

ctehm74n

ctehm74n4#

你可以用这个正则表达式得到匹配项:

(?<=,|^)\s*(\d+)\s*(?=,|$)

相关问题