JS str.replace(正则表达式,函数)并不贪心

时间:2018-02-16 06:07:08

标签: javascript regex replace

我有这个正则表达式,它抓取换行符分隔的文本块,其中所有行都缩进两个空格:

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

在regex101上(请参阅此处的确切片段https://regex101.com/r/BFMtHP/1),它工作正常(将整个块作为一个匹配项抓取),但是当我这样做时:

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

不是在每个缩进的文本块周围放置div,而是在每行缩进的周围放置div。

为什么lyrics.replace不贪婪,而是重复每一行?

修改

我将此作为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"

我希望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>"

但问题是我目前的代码产生了这个:

"[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>"

1 个答案:

答案 0 :(得分:3)

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)