【问题标题】:Javascript replace method, replace with "$1"Javascript 替换方法,替换为“$1”
【发布时间】:2011-03-15 05:26:39
【问题描述】:

我正在阅读 Sitepoints 2007 年出版的“Simply Javascript”一书,遇到了一些我无法理解的代码。

代码如下:

Core.removeClass = function(target, theClass)
{
    var pattern = new RegExp("(^| )" + theClass + "( |$)");
    target.className = target.className.replace(pattern, "$1");
    target.className = target.className.replace(/ $/, "");
};

第一次调用 replace 方法让我很困惑,我不明白“$1”值来自哪里或它的含义。我会认为调用应该用“”替换找到的模式。

【问题讨论】:

    标签: javascript regex replace


    【解决方案1】:

    每对括号(...),其中第一个字符不是?* 是一个“捕获组”,将其结果放入$1,$2,$3等可用于替换模式。

    您可能还会在其他正则表达式引擎中看到与 \1,\2,\3 相同的内容,(或者有时确实在原始表达式中,用于重复)

    这些被称为“反向引用”,因为它们通常引用表达式中的(较早的)部分。

    (*? 表示各种形式的特殊行为,包括非捕获组(?:...) 和不捕获组。)


    在您的具体示例中,$1 将是组 (^| ),即“字符串开头的位置(零宽度)或单个空格字符”。

    因此,通过用它替换整个表达式,您基本上是在删除变量 theClass 并可能在其后删除一个空格。 (结束表达式 ( |$) 是相反的 - 一个空格或字符串结束位置 - 因为它的值没有被使用,所以可以用 (?: |$) 代替。)


    希望这可以解释一切 - 如果您想了解更多信息,请告诉我。

    另外,这里有一些来自网站regular-expressions.info的进一步阅读:

    【讨论】:

    • 谢谢,现在很清楚了。我在理解“每对括号”的含义时遇到了一些麻烦,但这适用于正则表达式模式。如果正则表达式模式包含一对括号,则它是一个捕获组。
    【解决方案2】:

    $1 是反向引用。它将被您的正则表达式匹配的第一个匹配组(括号集)替换。

    【讨论】:

    • 在这种情况下,$1 将是空的(如果第一组匹配 0 宽度的 ^ 行首字符)或空格(如果第一组匹配空格)。
    • 不,它称为反向引用。它被称为“特殊替换模式”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2013-07-27
    • 2013-10-25
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    相关资源
    最近更新 更多