JS正则表达式括号前添加的东西

问题描述 投票:0回答:3

我有以下字符串:

@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'))

其他的正则表达式工作,所以我知道有什么错我的设置。

javascript regex gulp
3个回答
1
投票

您捕捉部分从一开始,直到组中最后一个分号之后,你是相匹配的右大括号。但是,为了得到你要参照捕获组的替代品,回来了。你所匹配不会在那里,因为你要更换你所匹配的。

要解决你的正则表达式,你可以捕获上次}在一组^(\@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

Regex demo

使用回调函数,你的代码可能是这样的:

.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);

1
投票

这个问题在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

0
投票

一种方法是捕捉最后}之前一切都在一个组,在与你想要的值一起拍摄组替换使用的回调函数。

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)
© www.soinside.com 2019 - 2024. All rights reserved.