Регулярное выражение Typescript исключает всю строку, если за ней следует определенная строка - PullRequest
0 голосов
/ 03 ноября 2018

Я сталкиваюсь со странными проблемами с regex и Typescript, в которых я пытаюсь заставить мое выражение заменить значение test минус первый экземпляр, если за ним следует test. Другими словами, замените первые две строки, которые имеют тест, но для третьей строки ниже замените только второе значение теста.

[test]
[test].[db]
[test].[test]

Где это должно выглядеть:

[newvalue]
[newvalue].[db]
[test].[newvalue]

Я придумал множество вариантов, но я подумал, что он достаточно прост, чтобы решить его, и regex101 может подтвердить это:

\[(\w+)\](?!\.\[test\])

Но при использовании Typescript (пользовательская задача в сборке VSTS) он фактически заменяет значения следующим образом:

[newvalue]
[newvalue].[db]
[newvalue].[test]

Обновление: Похоже, что регулярное выражение (тест) (?!. Test) разрывается при изменении вариантов использования, удаляя квадратные скобки, что заставляет меня думать, что это может быть где-то в коде. Может ли быть проблема с индексом, в котором заменяется значение?

Часть кода в Typescript, который вызывает это:

 var filePattern = tl.getInput("filePattern", true);
 var tokenRegex = tl.getInput("tokenRegex", true);
 for (var i = 0; i < files.length; i++) {
            var file = files[i];
            console.info(`Starting regex replacement in [${file}]`);

            var contents = fs.readFileSync(file).toString();
            var reg = new RegExp(tokenRegex, "g");

            // loop through each match
            var match: RegExpExecArray;
            // keep a separate var for the contents so that the regex index doesn't get messed up
            // by replacing items underneath it
            var newContents = contents;
            while((match = reg.exec(contents)) !== null) {
                var vName = match[1];
                    // find the variable value in the environment
                    var vValue = tl.getVariable(vName);
                    if (typeof vValue === 'undefined') {
                        tl.warning(`Token [${vName}] does not have an environment value`);
                    } else {
                        newContents = newContents.replace(match[0], vValue);
                        console.info(`Replaced token [${vName }]`);
                    }           
                }
            }

Полный код для задачи, которую я использую с: https://github.com/colindembovsky/cols-agent-tasks/blob/master/Tasks/ReplaceTokens/replaceTokens.ts

1 Ответ

0 голосов
/ 03 ноября 2018

Для меня это регулярное выражение работает так, как вы ожидаете:

\[(test)\](?!\.\[test\])

с таким кодом Typescript

myString.replace(/\[(test)\](?!\.\[test\])/g, "[newvalue]");

Вместо этого используемое вами регулярное выражение должно заменить также часть [db].

Я пробовал с этим кодом:

class Greeter {
    myString1: string;
    myString2: string;
    myString3: string;
    greeting: string;
    constructor(str1: string, str2: string, str3: string) {
        this.myString1 = str1.replace(/\[(test)\](?!\.\[test\])/g, "[newvalue]");
        this.myString2 = str2.replace(/\[(test)\](?!\.\[test\])/g, "[newvalue]");
        this.myString3 = str3.replace(/\[(test)\](?!\.\[test\])/g, "[newvalue]");
        this.greeting = this.myString1 + "\n" + this.myString2 + "\n" + this.myString3;
    }
    greet() {
        return "Hello, these are your replacements:\n" + this.greeting;
    }
}

let greeter = new Greeter("[test]", "[test].[db]", "[test].[test]");

let button = document.createElement('button');
button.textContent = "Say Hello";
button.onclick = function() {
    alert(greeter.greet());
}

document.body.appendChild(button);

Онлайн игровая площадка здесь .

...