【问题标题】:Regular Expression Replace in Javascript?Javascript中的正则表达式替换?
【发布时间】:2012-03-31 22:55:17
【问题描述】:

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

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

【问题讨论】:

  • 即使在使用我的代码后,我也得到了原始字符串。我实际上应该得到:
    abc 123
  • 你认为应该是什么?删除整个双斜线?
  • 我不明白您为什么觉得有必要这样做,因为 &lt;div&gt; 无论如何都不会显示前导或尾随空格。

标签: javascript regex


【解决方案1】:

值得注意的是,由于 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

【讨论】:

  • 这将删除 div 并保留您应该编写的内部文本 h.replace(/(
    )\s*(.*?)\s*()/ gi, "$1$2$3");
  • 我想保留 div 并简单地修剪 div 内的前导/尾随空格。您的第二个示例代码就是答案。谢谢。很好的答案。
  • 我想指出,如果有嵌套的 div,使用.*? 会导致问题:&lt;div&gt; a &lt;div&gt; b &lt;/div&gt;c&lt;/div&gt; 会产生&lt;div&gt;a &lt;div&gt; b&lt;/div&gt;c&lt;/div&gt;。嵌套没有通用的解决方案(不是常规语言),但至少使用[^&lt;]*? 在嵌套的情况下会很快失败,而不是产生不正确的结果(它只会替换最里面的 div)。跨度>
【解决方案2】:

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

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

[^&lt;]*? 会懒惰地匹配任何不是&lt; 的东西(包括空格)。由于它是惰性的,因此不会包含紧接在结束标记之前的所有空格。

working demo

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

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签