Javascript中的正则表达式替换?

时间:2012-03-31 22:55:18

标签: javascript regex

我正在尝试使用javascript rgular表达式修剪div中的前导和尾随空格,但它似乎不起作用。我的代码如下。您可以在Online Javascript Testing处尝试此代码。我的目标是删除 abc 123 之前和之后的所有空格,但是在封闭div之内。

var h = "<div>    abc  123    </div>";
h = h.replace(new RegExp("\\<div\\>\\s*\\<\\/div\\>", "gi"), "");
alert(h);

2 个答案:

答案 0 :(得分:6)

值得注意的是,由于HTML不是regular language,因此除非您具有非常狭窄的定义范围,否则无法可靠地对具有正则表达式的HTML片段进行操作。例如,在这里,如果文本真的如你所示,我们可以这样做,但如果有嵌套的div,则不能(可靠)(为此我们需要的不仅仅是正则表达式)。

解决这个问题:

我会使用文字而不是传递给RegExp构造函数的字符串。它只是让事情变得简单一些。然后我会使用一个捕获组并用该组的内容替换整体匹配。并且您需要在要匹配的文本之后使用规则以消耗最后的空白。这意味着中间的规则需要非贪婪。所有这些都来自:

var h = "<div>    dsd  dsdsd    </div>";
h = h.replace(/<div>\s*(.*?)\s*<\/div>/gi, "$1");
alert("'" + h + "'");

Live example | source

或者,如果您想保留div代码:

var h = "<div>    dsd  dsdsd    </div>";
h = h.replace(/(<div>)\s*(.*?)\s*(<\/div>)/gi, "$1$2$3");
alert(h);

Live example | source

Reference

答案 1 :(得分:2)

您可以使用捕获组来获取内容。顺便说一句,为什么要使用RegExp函数而不是文字?你必须少输入\ s ...

h = h.replace(/<div>\s*([^<]*?)\s*<\/div>/g, "<div>$1</div>");

[^<]*?会懒惰地匹配任何不是<(包括空格)的内容。由于它是懒惰的,因此不会包括在结束标记之前的所有空格。

working demo

(小心嵌套的html虽然......如果你的标签可以嵌套,最好不要使用正则表达式)