Regex: заменить перед словом - PullRequest
0 голосов
/ 20 марта 2019

У меня есть эта строка:

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 ]

1 голос
/ 20 марта 2019

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;

}

Explantaion

Звучит так, как будто вы хотите соответствовать позиции , а нефактический текст.Как и в

, я хочу сопоставить положение между фигурной скобкой у символов pm.expect.

Многие библиотеки регулярных выражений поддерживают выражения обхода именно для этого сценария.К счастью, Javascript поддерживает прогнозирование.К сожалению, только Chrome поддерживает lookbehinds, но он ведет нас на полпути, а остальное можно сделать с помощью захваченных групп.

Сначала мы сопоставляем фигурную скобку в группе, чтобы мы могли использовать обратную ссылку в строке замены:

({)

Далее мы используем прогноз.Это выражение будет оценивать символы, которые следуют, но оно не будет захватывать их и не будет перемещать указатель вперед.Это выражение будет соответствовать только фигурным скобкам, но оно будет соответствовать только фигурным скобкам, за которыми следует желаемое выражение:

(?=pm.expect)

Если сложить это вместе, мы получим:

({)(?=pm.expect)

ВВ качестве замены вы можете использовать {\n\t или, если хотите, вы можете использовать обратную ссылку на захваченную группу, $1\n\t.

Вы также можете использовать прогноз для pm.test:

(?=pm.test)

Это выражение будет соответствовать строке нулевой длины , поэтому, как правило, позиция перед pm.test.Если вы сделаете замену, вы, по сути, будете вставлять текст, а не заменять его.

Наконец, вы не приняли во внимание пробелы.Между { и pm.expect есть пробел, который не позволяет вашим регулярным выражениям сопоставлять что-либо.

1 голос
/ 20 марта 2019

Вы можете использовать замену и ее обратный вызов с захватом групп.

^(\*\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)
0 голосов
/ 20 марта 2019

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>
0 голосов
/ 20 марта 2019

Do:

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]); });"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...