Проблема с вызовом функции для замены определенных подстрок регулярным выражением - PullRequest
1 голос
/ 12 марта 2019

У меня есть такая строка (это пример проблемы):

let s = `import {
    A,
    B
} from 'moduleA';
import {
    C,
    D
} from 'moduleB';`;

И мне нужно изменить имена всех модулей через функцию.Названия модулей я получаю программно.

let regExpStr = "^import [\\s\\S\\w]* from '(moduleA|moduleB)';";
let regExp = new RegExp(regExpStr, "gm");
let data = s.replace(regExp, function(param, p1, p2) {
    return param.replace(p1, "modified " + p1);
});
console.log(data);

И это вывод:

import {
    A,
    B
} from 'moduleA';
import {
    C,
    D
} from 'modified moduleB';

Как видите, я изменил только moduleB, но не moduleA.Что не так с моим регулярным выражением?

1 Ответ

2 голосов
/ 12 марта 2019

Жадный * заставляет регулярное выражение перехватывать всю строку, заменяя только последний модуль.Использование не жадного квантификатора *? позволяет регулярному выражению сопоставлять несколько экземпляров шаблона import { ... } from 'moduleN' по всей строке:

let s = `import {
    A,
    B
} from 'moduleA';
import {
    C,
    D
} from 'moduleB';`;

let regExpStr = "^import [\\s\\S\\w]*? from '(moduleA|moduleB)';";
let regExp = new RegExp(regExpStr, "gm");
let data = s.replace(regExp, function(param, p1, p2) {
    return param.replace(p1, "modified " + p1);
});
console.log(data);

Я бы также рекомендовал использовать ссылки на литералы regex и группы захвата знака доллара для упрощения вашего кода:

const s = `import {
    A,
    B
} from 'moduleA';
import {
    C,
    D
} from 'moduleB';`;

const pattern = /^(import [\s\S\w]*? from ')(moduleA|moduleB)(';)/gm;
const data = s.replace(pattern, "$1modified $2$3");
console.log(data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...