打字稿正则表达式如果后面跟特定字符串则排除整个字符串

时间:2018-11-02 23:53:14

标签: regex typescript regex-negation

我一直在遇到正则表达式和Typescript的怪异问题,在这些问题中,我试图让表达式替换test的值减去第一个实例(如果后面跟有test的值)。换句话说,替换具有测试的前两行,但对于下面的第三行,仅替换第二个test值。

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

应显示为:

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

我提出了很多变种,但这是我认为很简单的一种解决方案,regex101可以确认这项工作:

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

但是当使用Typescript(VSTS构建中的自定义任务)时,它实际上将替换以下值:

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

更新:在更改用例时,看起来像(reg)(?!。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 :(得分:0)

对于我来说,此正则表达式的工作方式与您期望的一样:

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

具有这样的打字稿代码

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);

在线游乐场here