正则表达式:替换在单词前面

时间:2019-03-20 15:45:47

标签: javascript regex

我有这个字符串:

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

4 个答案:

答案 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)

TL; DR;

您可以使用先行方式在比赛前处理“插入”文本,而无需考虑空格。

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>