Regex немедленно останавливает совпадение или если есть запятая - PullRequest
3 голосов
/ 16 июня 2020

Я, вероятно, не сформулировал вопрос наилучшим образом, но терпите меня

Имея эту строку

select * from my_functions (in_p1 := remove,
                                   in_p2 := $1,
                                   in_p3 := remove,
                                   in_p4 := $2,
                                   in_p5 := remove,
                                   in_p6 := $3,
                                   in_p7 := remove)

Мне нужно удалить параметры, которые соответствуют для поиска, с ключевым словом remove

Итак, я построил этот text = text.replace(/,[^,]*?remove/g, ''), который работает для всех случаев, кроме p1. Как я могу сказать ему, чтобы он немедленно остановил совпадение или, если есть запятая, останавливать только после запятой?

1 Ответ

3 голосов
/ 16 июня 2020

Поскольку вам нужно удалить запятую в двух возможных местах, единственный вариант, который я вижу для этого с одним регулярным выражением, - это альтернатива:

//                   vvvvvvvvvvvvv−−−−−−−−−−−−−−−−−−−−−−−−−−−−− first alternative
text = text.replace(/,[^,]*?remove|(?<=\()[^,]*?remove,/g, '');
//                                 ^^^^^^^^^^^^^^^^^^^^−−−−−−−− second alternative

Альтернативы - это ваше исходное выражение, которое соответствует другим чем in_p1, и альтернатива, которая соответствует in_p1 и удаляет запятую после него (а не перед ним).

Пример:

let text = `select * from my_functions (in_p1 := remove,
                                   in_p2 := $1,
                                   in_p3 := remove,
                                   in_p4 := $2,
                                   in_p5 := remove,
                                   in_p5_ := remove,
                                   in_p6 := $3,
                                   in_p7 := remove)`;
                                   
text = text.replace(/,[^,]*?remove|(?<=\()[^,]*?remove,/g, '');
console.log(text);

Обратите внимание, что здесь используется просмотр назад для (. Поиск назад относительно новый для JavaScript. Я думаю, что мы можем избавиться от просмотра назад, если ваша целевая платформа не поддерживает его, используя захват:

text = text.replace(/,[^,]*?remove|(\()[^,]*?remove,/g, '$1');

Пример:

let text = `select * from my_functions (in_p1 := remove,
                                   in_p2 := $1,
                                   in_p3 := remove,
                                   in_p4 := $2,
                                   in_p5 := remove,
                                   in_p5_ := remove,
                                   in_p6 := $3,
                                   in_p7 := remove)`;
                                   
text = text.replace(/,[^,]*?remove|(\()[^,]*?remove,/g, '$1');
console.log(text);

Обратите внимание, что я добавил туда дополнительный параметр, чтобы дважды проверить, правильно ли были удалены два параметра «удалить» в строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...