我一直在遇到正则表达式和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
一起使用的任务答案 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。