Я хочу добавить суффикс .min
к моим файлам, которые не находятся в папке vendor
.
let str = '/js/index.js';
let str2 = '/vendor/socket-io/library.js';
let myregex = new RegExp('^([^/vendor]*.*[^min]{3}\\.)([a-z]{1,2}s)', 'g');
let myreplace = '$1min.$2';
console.log(str.replace(myregex, myreplace));
console.log(str2.replace(myregex, myreplace));
Выходит из системы
/js/index.min.js
/vendor/socket-io/library.min.js
По какой-то причине он соответствует library.js
хотя я исключен /vendor
:
^([^/vendor]*.* ...
При тестировании на https://regex101.com/ все это проверяется, но javascript думает иначе.
Это список необходимого соответствия:
/vendor/bootstrap/css/bootstrap.min.css --> DO NOT MATCH
/vendor/font-awesome/font-awesome.min.css --> DO NOT MATCH
/vendor/jquery/jquery.min.js --> DO NOT MATCH
/vendor/bootstrap/js/bootstrap.min.js --> DO NOT MATCH
/vendor/socket-io/library.js --> DO NOT MATCH
/js/index.js --> MATCH
/css/style.css --> MATCH
/some/other/script.js --> MATCH
Зачем?
Если папка vendor
является верхней папкой, вы можете использовать
^(?!\/vendor(?:\/|$))(?!.*\.min\.[^.]*$)(.*\.)
Замените $1min.
, См. Демо-версию regex.
подробности
^
- начало строки(?!\/vendor(?:\/|$))
- не может быть /vendor/
или /vendor
после чего конец строки сразу слева(?!.*\.min\.[^.]*$)
- после любых 0+ символов, как можно больше, не должно быть .min.
за которыми следуют любые символы, кроме .
до конца строки(.*\.)
- Группа 1: любые символы 0+, отличные от символов прерывания строки, как можно больше, до последнего .
и .
сам. Строка замены $1min.
вставляет значение Group 1 и добавляет min.
после этого.
JS demo:
var ss = ["/vendor/bootstrap/css/bootstrap.min.css", "/vendor/font-awesome/font-awesome.min.css", "/vendor/jquery/jquery.min.js", "/vendor/bootstrap/js/bootstrap.min.js", "/vendor/socket-io/library.js", "/js/index.min.js", "/js/index.js", "/css/style.css", "/some/other/script.js"];
var re = /^(?!\/vendor(?:\/|$))(?!.*\.min\.[^.]*$)(.*\.)/;
for (var s of ss) {
console.log(s, "=>", s.replace(re, "$1min."));
}
m
. Можно ли это сделать без m
и только с g
? Я должен использовать только g
m
. Вы получаете отдельные строки в качестве входных данных. Моя демо-версия представляет собой одну строку с разрывами строк внутри, поэтому я использовал модификатор m
. Если ваш ввод также является многострочной строкой, такой как в демонстрации, вы можете использовать 'gm'
, но я сомневаюсь, что это так.
Я считаю, что это регулярное выражение, которое вы ищете.
^(((?!\/vendor)(?!\.min\.).)*?)(\..+)$
Это регулярное выражение работает следующим образом:
vendor
или .min.
.
за которыми следуют любые символы (но должно быть не менее 1), вы можете изменить .
на что угодно. Я оставил его как .
поскольку расширения могут включать в себя множество символов Сделайте свой заменяющий текст следующим: $1.min$3
.
вход
/vendor/bootstrap/css/bootstrap.min.css
/vendor/font-awesome/font-awesome.min.css
/vendor/jquery/jquery.min.js
/vendor/bootstrap/js/bootstrap.min.js
/vendor/socket-io/library.js
/js/index.js
/css/style.css
/some/other/script.js
Выход
/vendor/bootstrap/css/bootstrap.min.css
/vendor/font-awesome/font-awesome.min.css
/vendor/jquery/jquery.min.js
/vendor/bootstrap/js/bootstrap.min.js
/vendor/socket-io/library.js
/js/index.min.js
/css/style.min.css
/some/other/script.min.js
[^/vendor]
- это класс всех символов, которые не являются/
,v
,e
,n
,d
,o
илиr
./vendor
как последовательность символов . Каковы требования к шаблону?