2017-01-18 4 views
1

Я пытаюсь написать регулярное выражение для соответствия очень длинному списку чисел, разделенных запятыми и необязательным пространством. Он не может совпадать с одним целым числом. Список чисел составляет около 7000 байт, ограниченный текстом с обеих сторон.Regex, чтобы соответствовать списку чисел

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 

Любая помощь будет оценена.

ответ

2

Как насчет

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

Разбивка:

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

Обратите внимание, что \s включает пробельные символы, кроме пространства и вкладки, в первую очередь разрывов строк (\n). Используйте [ \t] вместо \s для предотвращения ложных срабатываний, если этого требует ваш ввод.

2

Вы можете использовать это регулярное выражение:

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

RegEx Demo

  • \d+ матчи 1 или более цифр
  • (?:...)+ матчи 1 или более из следующих чисел, разделенных запятой, необязательно, окруженные пространством/вкладке ,
+1

400K! Поздравления. – fedorqui

+1

Большое спасибо @fedorqui за ваш добрый и * своевременный * пожелания – anubhava

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

\d+,\s* соответствует всем числам с запятой с последующим пробелом/nospace. Однако нам нужно следить за последним числом, которое не имеет «,», как в приведенной выше группе. Так закончите с последним номером \d+.