假设我有一个像这样的字符串:
.bye
但是我想删除前三个点,并将!
替换为hello world!
所以输出应该是
...
仅在同时满足两个条件(开头.bye
和结尾{{1}})的情况下才匹配
我正在尝试使用js替换方法。能否请你帮忙?谢谢
答案 0 :(得分:0)
您的正则表达式将是
const rx = /\.\.\.([\s\S]*?)\.bye/g
const out = '\n\nfoobar...hello world.bye\nfoobar...ok.bye\n...line\nbreak.bye\n'.replace(rx, `$1!`)
console.log(out)
用英语找到三个点,每个点都渴望出现,并以.bye结尾。
替换使用字符串模板的第一个匹配$1
和concats !
。
答案 1 :(得分:0)
首先匹配点,捕获并延迟重复任何字符,直到到达.bye
,然后匹配.bye
。然后,您可以替换为第一个捕获的组,加上感叹号:
const str = '...hello world.bye';
console.log(str.replace(/\.\.\.(.*)\.bye/, '$1!'));
这里有懒惰重复项,可确保您的匹配不太多,例如:
const str = `...hello world.bye
...Hello again! Goodbye.`;
console.log(str.replace(/\.\.\.(.*)\.bye/g, '$1!'));
答案 2 :(得分:0)
您实际上不需要正则表达式即可。尽管有点不雅致,但以下代码应该可以正常工作(显然,可以在您的应用程序上下文中以任何有意义的方式调用该函数):
function manipulate(string) {
if (string.slice(0, 3) == "..." && string.slice(-4) == ".bye") {
return string.slice(4, -4) + "!";
}
return string;
}
(很抱歉,如果我在此处进行索引时犯了任何愚蠢的错误,但基本思路应该很明显。)
至少对我来说,这具有比正则表达式更易于推理的优点。当然,如果您需要处理更复杂的情况,则可能会达到正则表达式最好的地步-但我个人不会为OP中提到的简单用例而烦恼。
答案 3 :(得分:0)
可以说是更简单的解决方案:
const str = '...hello world.bye'
const newStr = /...(.+)\.bye/.exec(str)
const formatted = newStr ? newStr[1] + '!' : str
console.log(formatted)
如果该字符串与正则表达式不匹配,它将仅返回该字符串。