Неправильное совпадение в замене

1

Я хочу добавить суффикс .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

Зачем?

  • 3
    [^/vendor] - это класс всех символов, которые не являются / , v , e , n , d , o или r .
  • 0
    Вы не "исключили" /vendor как последовательность символов . Каковы требования к шаблону?
Показать ещё 2 комментария
Теги:

2 ответа

2
Лучший ответ

Если папка 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."));
}
  • 0
    хорошо, это работает, но только с многострочным m . Можно ли это сделать без m и только с g ? Я должен использовать только g
  • 0
    @ Моше: Тебе не нужно m . Вы получаете отдельные строки в качестве входных данных. Моя демо-версия представляет собой одну строку с разрывами строк внутри, поэтому я использовал модификатор m . Если ваш ввод также является многострочной строкой, такой как в демонстрации, вы можете использовать 'gm' , но я сомневаюсь, что это так.
1

Я считаю, что это регулярное выражение, которое вы ищете.

^(((?!\/vendor)(?!\.min\.).)*?)(\..+)$

Это регулярное выражение работает следующим образом:

  1. Захватите все символы (но как можно меньше), которые не содержат vendor или .min.
  2. Захват . за которыми следуют любые символы (но должно быть не менее 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню