简体   繁体   English

JS str.replace(regex,function)不贪心

[英]JS str.replace(regex, function) is not being greedy

I have this regex, which grabs a newline-separated block of text where all lines are indented by two spaces: 我有此正则表达式,它捕获换行符分隔的文本块,其中所有行均由两个空格缩进:

chorusRegex = /((?:(?:\n|^)  .*)+)/g

On regex101 (see exact snippet here https://regex101.com/r/BFMtHP/1 ) it works fine (grabs the whole block as one match), but when I do this: 在regex101上(请在此处查看确切的片段https://regex101.com/r/BFMtHP/1 ),它可以正常工作(将整个块作为一个匹配项抓取),但是当我这样做时:

lyrics = lyrics.replace(chorusRegex, function($0, $1) {
  return "<div class='chorus'>" + $1 + "</div>"
})

Instead of putting the div around each indented block of text, it puts divs around each line that's indented. 而不是将div放在每个缩进的文本块周围,而是将div放在每个缩进的行周围。

Why is lyrics.replace not being greedy, and instead repeating over each line? 为什么lyrics.replace不贪婪,而是在每一行重复出现?

Edit 编辑

I have this as lyrics 我有这个lyrics

"[D]No tenemos Sumo [A]Sacerdote que
No [Bm]se compadece en [G]mi debilidad
[D]Sino Uno que fue [A]tentado en todo [Bm]igual
Que nosotros[G]
[]Sin pecado. 

  [D]Vamos confiada[A]mente 
  Al [Bm]trono de la [G]gracia por
  [D]Misericordia, [A]gracia
  Y opor[Bm]tuno so[G]corro h[D]allar. 

  sadf
  sadf
  weqrqwer"

And I want the replace function to produce this: 我想要replace函数来产生这个:

"[D]No tenemos Sumo [A]Sacerdote que
No [Bm]se compadece en [G]mi debilidad
[D]Sino Uno que fue [A]tentado en todo [Bm]igual
Que nosotros[G]
[]Sin pecado. 

<div class='chorus'> 
  [D]Vamos confiada[A]mente 
  Al [Bm]trono de la [G]gracia por
  [D]Misericordia, [A]gracia
  Y opor[Bm]tuno so[G]corro h[D]allar. 
</div>

<div class='chorus'> 
  sadf
  sadf
  weqrqwer 
</div>"

But the problem is my current code is producing this: 但是问题是我当前的代码正在产生这个:

"[D]No tenemos Sumo [A]Sacerdote que
No [Bm]se compadece en [G]mi debilidad
[D]Sino Uno que fue [A]tentado en todo [Bm]igual
Que nosotros[G]
[]Sin pecado. 

<div class='chorus'> 
  [D]Vamos confiada[A]mente   
</div>
<div class='chorus'> 
  Al [Bm]trono de la [G]gracia por 
</div>
<div class='chorus'> 
  [D]Misericordia, [A]gracia 
</div>
<div class='chorus'> 
  Y opor[Bm]tuno so[G]corro h[D]allar. 
</div>"

 var lyrics = "[D]No tenemos Sumo [A]Sacerdote que\\n\\ No [Bm]se compadece en [G]mi debilidad\\n\\ [D]Sino Uno que fue [A]tentado en todo [Bm]igual\\n\\ Que nosotros[G]\\n\\ []Sin pecado.\\n\\ \\n\\ [D]Vamos confiada[A]mente\\n\\ Al [Bm]trono de la [G]gracia por\\n\\ [D]Misericordia, [A]gracia\\n\\ Y opor[Bm]tuno so[G]corro h[D]allar.\\n\\ \\n\\ sadf\\n\\ sadf\\n\\ weqrqwer", chorusRegex = /((?:(?:\\n|^) .*)+)/g; lyrics = lyrics.replace(chorusRegex, "<div class='chorus'>$1</div>"); console.log(lyrics) 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM