正则表达式替换第一个元素

时间:2017-09-14 13:46:53

标签: javascript regex replace

我需要将HTML字符串的内容从一个<br>替换为两个。但是我无法实现的是当我有一个标签跟随另一个标签时:

(<br\s*\/?>)

将匹配此文本中的所有标记:

var text = 'text<BR><BR>text text<BR>text;'

将匹配并且替换我将

text = text.replace.replace(/(<br\s*\/?>)>/gi, "<BR\/><BR\/>")

console.log(text); //text<BR/><BR/><BR/><BR/>text text<BR/><BR/>text;"

有没有办法只用正则表达式增加一个标签?并实现这一点:

console.log(text); //text<BR/><BR/><BR/>text text<BR/><BR/>text;"

或者我只会通过循环实现这一目标?

2 个答案:

答案 0 :(得分:2)

您可以使用

var text = 'text<BR><BR>text text<BR>text;'
text = text.replace(/(<br\s*\/?>)+/gi, "$&$1");
console.log(text); // => text<BR><BR><BR>text text<BR><BR>text;

在这里,(<br\s*\/?>)+/gi以不区分大小写的方式匹配1个或多个<br>序列,同时捕获每个标记的路径(保持最后一个值之后的组中的最后一个值,并且{ {1}}将替换为整个匹配("$&$1"),并将$&<br>一起添加。

或者

$1

此处,var text = 'text<BR><BR>text text<BR>text;' text = text.replace(/(?:<br\s*\/?>)+/gi, function ($0) { return $0.replace(/<br\s*\/?>/gi, "<BR/>") + "<BR/>"; }) console.log(text); // => text<BR/><BR/><BR/>text text<BR/><BR/>text;也会匹配1个或多个(?:<br\s*\/?>)+,但不会捕获每个匹配项,并且在回调中,所有<br>都会标准化为<br>并且<BR/>将附加到结果中。

答案 1 :(得分:0)

如果有任何连续的话,你可以使用负向前看(<br\s*\/?>)(?!<br\s*\/?>)/来仅增加最后一个标签:

&#13;
&#13;
var text = 'text<BR><BR>text text<BR>text;'

text = text.replace(/(<br\s*\/?>)(?!<br\s*\/?>)/gi, "<BR\/><BR\/>")

console.log(text);
&#13;
&#13;
&#13;