使用 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(...);
$
字符串结束
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])
我有示例文本:
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(...);
$
字符串结束
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])