我有以下字符串:
@something {
color: red;
background: yellow;
}
我想结束括号前添加heyaaa
,例如..
@something {
color: red;
background: yellow;
heyaaa
}
我使用gulp string replace搜索@something
一个CSS文件和右括号之前添加所需的heyaaa
字符串。
我试着以下但不工作...
.pipe(replace('^(\@something\s*{(?:\n.*)*?\n)}', 'heyaaa'))
其他的正则表达式工作,所以我知道有什么错我的设置。
您捕捉部分从一开始,直到组中最后一个分号之后,你是相匹配的右大括号。但是,为了得到你要参照捕获组的替代品,回来了。你所匹配不会在那里,因为你要更换你所匹配的。
要解决你的正则表达式,你可以捕获上次}
在一组^(\@something\s*{(?:\n.*)*?\n)(})
和替换是指那些群体。
const regex = /^(\@something\s*{(?:\n.*)*?\n)(})/gm;
const str = `@something {
color: red;
background: yellow;
}`;
const subst = `$1 heyaa\n$2`;
const result = str.replace(regex, subst);
console.log(result);
采取串入帐户和最后一行的缩进开始,你可以匹配的第一行,然后重复,而不是看一个新行后跟一个}
。
你可以捕捉在开始的空白字符在捕获组和参考,在更换,以匹配heyaaa
缩进:
^(@[^{]+{\s*(?:(?!\n})(\s+).*\n)*)(})
模式说明
^
启动(
捕获组
@[^{]+{\s*
匹配@
,1 + T输入法编辑器不{
。再搭配{
和0+次空格字符
(?:
非捕获组
(?!\n})(\s+).*\n
断言是什么,右边是不是一个新行后跟一个}
。如果是这样的话,整个匹配行后跟一个新行
)*
关闭组,重复0+倍)
关闭捕获组(})
捕获右括号$
结束在更换你可以使用3个捕获组:
$1$2heyaaa\n$3
使用回调函数,你的代码可能是这样的:
.pipe(replace(/^(@[^{]+{\s*(?:(?!\n})(\s+).*\n)*)(})/, function(_,g1,g2,g3) {
return g1 + g2 + "heyaaa\n" + g3; }
)
)
const regex = /^(@[^{]+{\s*(?:(?!\n})(\s+).*\n)*)(})/gm;
const str = `@something {
color: red;
background: yellow;
}`;
const subst = `$1$2heyaaa\n$3`;
const result = str.replace(regex, subst);
console.log(result);
这个问题在replace
函数的第二个参数:你的代码替换做什么用heyaaa
,而不是匹配在你想要的位置插入heyaaa
的。
你可以简单地做以下,参照$1
(第一组相匹配)的第二个参数(替换):
const input = `@something {
color: red;
background: yellow;
}
@otherthing {
color: red;
background: yellow;
}
`
const regex = /^(\@something+\s*{(?:\n.*)*?\n)}/gm
const result0 = input.replace(regex, 'NEW TEXT TO BE INSERTED') // Original substitution
const result1 = input.replace(regex, '$1 NEW TEXT TO BE INSERTED\n}') // Fixed substitution
console.log(result0) // Original result
console.log(result1) // Fixed result
更新:说明
我添加m
对于多行的正则表达式匹配和用于多个匹配g
后缀后缀(没有它reagexp施加在只有第一匹配)。
如果你需要在每一个CSS类的末尾添加NEW TEXT TO BE INSERTED
,你应该改变@something
成正则表达式@[^\s]
(见下面的代码片段)。
const input = `@something {
color: red;
background: yellow;
}
@otherthing {
color: red;
background: yellow;
}
`
const regex = /^(\@[^\s]+\s*{(?:\n.*)*?\n)}/gm
const result = input.replace(regex, '$1 NEW TEXT TO BE INSERTED\n}') // Fixed substitution
console.log(result) // Fixed result
一种方法是捕捉最后}
之前一切都在一个组,在与你想要的值一起拍摄组替换使用的回调函数。
let str = `@something {
color: red;
background: yellow;
}`
let op = str.replace(/^(@something\s*[\w\W]+)}$/g,function(_,g1){
return g1 + ' heyya,\n}'
})
console.log(op)