如何解释$1元,2元;在JavaScript中使用正则表达式时?

如何解释$1元,2元;在JavaScript中使用正则表达式时?,javascript,regex,Javascript,Regex,一段JavaScript代码如下所示: num = "11222333"; re = /(\d+)(\d{3})/; re.test(num); num.replace(re, "$1,$2"); 我无法理解“$1,$2”的语法。该代码来源的书上说,$1表示RegExp.$1,$2表示RegExp.$2。但这些解释引出了更多的问题: 众所周知,在JavaScript中,变量的名称应该以字母或_开头,$1在这里怎么可能是RegExp成员变量的有效名称 如

一段JavaScript代码如下所示:

num = "11222333";
re = /(\d+)(\d{3})/;
re.test(num);
num.replace(re, "$1,$2");
我无法理解
“$1,$2”
的语法。该代码来源的书上说,
$1
表示
RegExp.$1
$2
表示
RegExp.$2
。但这些解释引出了更多的问题:

  • 众所周知,在JavaScript中,变量的名称应该以字母或_开头,
    $1
    在这里怎么可能是RegExp成员变量的有效名称

  • 如果我输入
    $1
    ,命令行会说它没有定义;如果输入
    “$1”
    ,则命令行仅回显
    $1
    ,而不是11222。那么,replace方法如何知道
    “$1,$2”
    的含义呢

  • 谢谢。

    它不是“变量”-它是在
    .replace()
    调用中使用的占位符
    $n
    表示正则表达式的第n个捕获组

    var num=“11222333”;
    //此正则表达式将最后3位数字捕获为捕获组#2
    //和所有前面的数字作为捕获组#1
    var re=/(\d+)(\d{3})/;
    控制台日志(重新测试(num));
    //这个replace调用替换正则表达式的匹配(发生
    //将所有内容匹配到第一个捕获组($1),然后是
    //逗号,后跟第二个捕获组($2)
    console.log(num.replace(re,“$1,$2”))
    众所周知,在Javascript中,变量的名称应该以字母或_开头

    不,不是<代码>$1
    是一个完全有效的变量。但是,您必须首先分配给它:

    $variable = "this is a test"
    

    这就是jQuery如何使用名为
    $
    的变量作为
    jQuery
    对象的别名。

    您误解了这行代码。您应该考虑字符串<代码>“$ 1,2美元”< /代码> A<强>格式说明符< /强>,该代码由<代码>替换< /代码>函数内部使用,以知道要做什么。它使用先前测试过的正则表达式,该表达式产生了两个结果(两个括号中的块),并重新格式化了结果
    $1
    指第一个匹配项,
    $2
    指第二个匹配项。因此,
    num
    字符串的预期内容在该位代码之后是
    11222333

    $1是正则表达式的第一组,2是第二组。组由括号定义,所以第一个组($1)是与(\d+)匹配的任何组。您需要对正则表达式进行一些阅读,以了解它与什么匹配

    众所周知,在Javascript中,变量的名称应该以字母或1开头,这里$1怎么可能是RegExp的成员变量的有效名称

    这不是真的与$1一样是有效的变量名。你只要试一下就可以发现这一点。请参阅jQuery和许多其他框架

    这段代码来源的书上说$1表示RegExp.$1,$2表示RegExp.$2

    这本书是纸做的。而报纸也无法对抗任何在其上书写的人的抵抗:-)。但也许你只是曲解了这本书的内容

    实际上,这取决于上下文

  • String
    replace()
    方法的上下文中,
    $1
    $2
    <代码>$99(1到99)是占位符。它们由
    replace()
    方法在内部处理(它们与
    RegExp.$1
    RegExp.$2
    等无关,这些可能甚至没有定义(请参见第2点)。)。看见将其与未使用标志
    g
    时的返回值进行比较,该返回值与的返回值类似。也与之相比
  • RegExp.$1
    RegExp.$2
    RegExp.$9(仅限1到9)是
    RegExp
    非标准属性。它们似乎是在您的浏览器上实现的,但对于其他人来说,它们无法定义。要使用它们,您需要始终使用
    RegExp.
    预先添加
    $1
    $2
    ,等等。这些属性是静态的、只读的,存储在
    RegExp
    全局对象中,而不是单个正则表达式对象中。但是,无论如何,您不应该使用它们。
    String
    replace()
    方法内部使用的
    $1
    $99
    存储在其他地方

  • 祝你今天愉快

    当有疑问时,:“替换字符串可以包括以下特殊替换模式…”(
    $1
    是一种
    $n
    替换模式)。另请参见-JavaScript没有PHP或Perl中的“插值”。您能告诉我这里的“插值”是什么意思吗?在带有插值的语言中,
    $name=“Fred”;打印“Hello$name!”
    可能会导致“Hello Fred!”。教科书对插值的一个定义是“在定点之间插入(某物)”,在计算机语言中,这通常意味着“将变量/表达式的值插入字符串”。JavaScript没有此功能。由于JavaScript中不存在这种情况,因此可以得出结论,
    “$1,$2”
    生成一个由5个字符组成的字符串,并且不会对任何变量的值进行插值-特殊处理来自
    字符串。replace
    函数(我也链接了该函数)。谢谢。但是我的问题(1)是什么呢,RegExt.$1?输入RegExp.$1时,命令行返回11222。所以$1似乎是object RegExt的成员变量。$1怎么可能是变量的名称?@user2384994:如果您的意思是将替换模式替换为
    RegExp.$1
    ,那么它应该返回
    RegExp.11222
    。不过,就目前而言,JavaScript变量可以以
    $
    开头。在JavaScript中,
    $1
    后面跟数字(例如。