使用 RegEx 和 javascript 剪切多行字符串

Cut multiline string with RegEx and javascript

我有示例文本:

var text = `class Eee {
   test(){
     console.log("123");
   }
}
use(123, Eee);

class Ttt {
   test(){
     console.log("123");
   }
}
use(456, Ttt);


class Ooo {
   test(){
     console.log("123");
   }
}
use(111, Ooo);
`;

我不会得到部分文本,例如:

`class Ttt {
   test(){
     console.log("123");
   }
}
use(456, Ttt);`

如果我使用正则表达式:

let result = text.match(/^class Ttt \{(.*)/gm); 

我有结果:[ 'class ttt {' ]

如果我使用正则表达式:

let result = text.match(/^class Ttt \{(.*)\}/gm); 

let result = text.match(/^class Ttt \{(.*)use\([\b].Ttt\);/gm);

我有结果:null。 我怎样才能得到我想要的整段文本,而不是第一行?

您指定了比赛的开始位置,但您还必须指定比赛结束的位置。

如果结束例如在新行的开头并且下一行应该是 use(456, Ttt); 它自己:

^[^\S\n]*class Ttt {[^]*?\n\s*}\s*\n\s*use\(.*\);$

注意 \s 也可以匹配换行符。

部分图案:

  • ^ 字符串开头
  • [^\S\n]* 匹配不带换行符的可选空白字符
  • class Ttt { 字面匹配
  • [^]*?匹配任意字符包括换行符,越少越好
  • \n\s*}\s* 在可选空白字符之间匹配换行符和 }
  • \nuse\(.*\);匹配一个换行符和use(...);
  • $ 字符串结束

Regex demo

var text = `class Eee {
   test(){
     console.log("123");
   }
}
use(123, Eee);

class Ttt {
   test(){
     console.log("123");
   }
}
use(456, Ttt);


class Ooo {
   test(){
     console.log("123");
   }
}
use(111, Ooo);
`;

const regex = /^[^\S\n]*class Ttt {[^]*?\n\s*}\s*\n\s*use\(.*\);$/m;
const m = text.match(regex);

if (m) {
  console.log(m[0]);
}

为了它的价值,这里有一个 non-regex 版本:

'class ' + text.split('class ')[1]

var text = `class Eee {
   test(){
     console.log("123");
   }
}
use(123, Eee);

class Ttt {
   test(){
     console.log("123");
   }
}
use(456, Ttt);


class Ooo {
   test(){
     console.log("123");
   }
}
use(111, Ooo);
`;

console.log('class ' + text.split('class ')[1])