Извлечь числа из строки, не начинающейся с символа комментария, используя регулярное выражение

Я пытаюсь заменить все номера не в разделе комментариев. Вот пример файла для исправления:

/* 2018-01-01 06:00:55 : realtime(0.002) --status(10)-- ++numretLines(0)++  --IP(192.168.1.5) PORT(22)-- queryNo(2)  comment[TO: Too much time]  TYPE[QUERY 4.2]  */
select count(*) from table where id1 = 41111 and id2 = 221144
GO

По сути, я хотел бы заменить числа в строках, не начинающихся с "/*".

Я придумал следующее регулярное выражение: /^(?!\/\*)(?:.+\K(\d+?))/gmU

Но мне удается извлечь только первый номер каждой строки, не начинающейся с "/*". Как я могу расширить это, чтобы получить все номера этих строк?

Спасибо!


person Maxime Dumas    schedule 28.11.2018    source источник
comment
См. regex101.com/r/iRNQOG/1.   -  person Wiktor Stribiżew    schedule 28.11.2018
comment
Какую технологию вы используете для своего регулярного выражения?   -  person Alfredo A.    schedule 28.11.2018
comment
Похоже, хороший ответ! Спасибо! Хотите поставить это как ответ, чтобы я мог отметить его как правильный ответ?   -  person Maxime Dumas    schedule 28.11.2018
comment
@АльфредоА. я использую Перл   -  person Maxime Dumas    schedule 28.11.2018


Ответы (2)


Предполагая, что ваш механизм регулярных выражений (о котором вы не сказали) поддерживает look behind и look ahead, вы можете использовать это регулярное выражение:

(?<!^\/\*.*)(?:(?<=\s)\d+(?=\s))+

Регулярное выражение начинается с использования negative look behind, поиска start of line, за которым следуют slash и star.

Затем он создает новый negative look behind для White Space, затем любое количество digits, за которым следует negative look ahead для White Space. Эта группа repeated any number of times.

Вам нужно установить флаг global и 'multiline'.

Регулярное выражение пропускает числа, не окруженные пробелами (например, 'id1').

person Poul Bak    schedule 28.11.2018
comment
Я попробовал ваше регулярное выражение на regex101.com, и оно жаловалось на * Квантификатор внутри просмотра назад делает его нефиксированной ширины. Кажется, работает, в зависимости от вкуса, который я выбираю. Это то, что не поддерживается всеми языками? - person Maxime Dumas; 29.11.2018
comment
Точно, это не поддерживается всеми разновидностями регулярных выражений. (Вы не написали какой аромат используете) - person Poul Bak; 29.11.2018

Основываясь на комментарии Wiktor Stribiżew, я использовал \/\*.*?\*\/(*SKIP)(*F)|-?\b\d+(\.\d+)? для извлечения чисел, включая десятичные дроби и отрицательные значения.

person Maxime Dumas    schedule 29.11.2018