我有这个字符串:
const string = `
* @test
* pm.test("Response time is less than 200ms", function() {
* pm.expect(pm.response.responseTime).to.be.below(500);
* });
* pm.test("Successful POST request", function() {
* pm.expect(pm.response.code).to.be.oneOf([200, 201, 202]);
* });
`;
我想对其进行一些更改,例如在每个pm.expect
和\n\t
前面添加一个,并在每个pm.test
和\n
前面添加一个
const cleaned = string
.replace(/\n/g, "")
.replace(/\s */g, ' ')
.replace(/\*/g, "")
.replace(/@[a-z]+/g, "")
.replace(/{(pm.expect)/g,'\n\t') // the problem is here
.replace(/(pm.test)/g,'\n') // the problem is here
我最后想要这样的东西:
pm.test("Response time is less than 200ms", function() {
pm.expect(pm.response.responseTime).to.be.below(500);
});
pm.test("Successful POST request", function() {
pm.expect(pm.response.code).to.be.oneOf([200, 201, 202]);
});
答案 0 :(得分:1)
您可以使用replace及其与捕获组的回调。
^(\*\s*)(?:(pm.test)|(pm.expect)
| | |__________ (Group 3, g3)
| |______________________ (Group 2, g3)
|_________________________________ (Group 1, g1)
const string = `
* @test
* pm.test("Response time is less than 200ms", function() {
* pm.expect(pm.response.responseTime).to.be.below(500);
* });
* pm.test("Successful POST request", function() {
* pm.expect(pm.response.code).to.be.oneOf([200, 201, 202]);
* });
`;
let op = string.replace(/^(\*\s*)(?:(pm.test)|(pm.expect))/gm,(match,g1,g2,g3)=>{
if(g2){
return g1 + '\n\t' + g2
} else {
return g1 + '\n' + g3
}
})
console.log(op)
答案 1 :(得分:1)
您可以使用先行方式在比赛前处理“插入”文本,而无需考虑空格。
function clean() {
const string = document.getElementById("input").value;
const cleaned = string
.replace(/\n/g, "")
.replace(/\s */g, ' ')
.replace(/\*/g, "")
.replace(/@[a-z]+/g, "")
.replace(/({)\s*(?=pm.expect)/g,'$1\n\t')
.replace(/\s*(?=pm.test)/g,'\n')
.replace(/(;)\s*(?=}\);)/g, '$1\n');
document.getElementById("result").textContent = cleaned;
}
<textarea id="input" style="width:100%; height: 10em;">
* @test
* pm.test("Response time is less than 200ms", function() {
* pm.expect(pm.response.responseTime).to.be.below(500);
* });
* pm.test("Successful POST request", function() {
* pm.expect(pm.response.code).to.be.oneOf([200, 201, 202]);
* });
</textarea>
<button onclick="clean()">Clean</button>
<pre id="result"></pre>
听起来您想匹配一个位置而不是实际的文本。如
我想匹配字符
pm.expect
上大括号之间的位置。
许多正则表达式库完全支持这种情况的环顾表达式。幸运的是,Javascript支持先行。不幸的是,只有Chrome支持后视功能,但它使我们走了一半,其余的可以通过捕获的组来完成。
首先,我们将花括号匹配为一组,以便可以在替换字符串中使用向后引用:
({)
接下来,我们先行使用。该表达式将评估后面的字符,但不会捕获它们,也不会将指针向前移动。此表达式仅匹配花括号,但仅匹配花括号,后跟所需的表达式:
(?=pm.expect)
将其放在一起,我们得到:
({)(?=pm.expect)
在替换中,您可以使用{\n\t
,或者,如果您想花哨的话,可以使用对捕获的组的后向引用$1\n\t
。
您还可以为pm.test
使用前瞻性功能:
(?=pm.test)
此表达式将匹配零长度字符串,因此基本上是pm.test
前的位置。如果您进行替换,则实际上是插入文本,而不是替换文本。
最后,您没有考虑空格。 {
和pm.expect
之间有一个空格,阻止您的正则表达式匹配任何内容。
答案 2 :(得分:0)
要做:
const cleaned = string
.replace(/\n/g, "")
.replace(/\s */g, ' ')
.replace(/\*/g, "")
.replace(/@[a-z]+/g, "")
.replace(/pm.expect/gi,"\n\tpm.expect")
.replace(/pm.test/gi,"\npm.test")
.trim()
您将获得:
"pm.test(\"Response time is less than 200ms\", function() {
pm.expect(pm.response.responseTime).to.be.below(500); });
pm.test(\"Successful POST request\", function() {
pm.expect(pm.response.code).to.be.oneOf([200, 201, 202]); });"
答案 3 :(得分:0)
const string = `
* @test
* pm.test("Response time is less than 200ms", function() {
* pm.expect(pm.response.responseTime).to.be.below(500);
* });
* pm.test("Successful POST request", function() {
* pm.expect(pm.response.code).to.be.oneOf([200, 201, 202]);
* });
`;
const cleaned = string
.replace(/\*\s+/g, '')
.replace(/@\w+/g, '')
.replace(/(pm\.test)/g, '\r\n$1')
.replace(/(pm\.expect)/g, '\t$1')
.trim();
// To show the result.
document.getElementsByTagName('textarea')[0].value = cleaned;
<textarea disabled style="width:100%; height:400px;"></textarea>