Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript正则表达式基础_Javascript_Regex - Fatal编程技术网

JavaScript正则表达式基础

JavaScript正则表达式基础,javascript,regex,Javascript,Regex,我正在尝试学习正则表达式,目前我已经从W3、Mozilla或其他网站的所有概述中获得了一个非常基本的理解,但当我浏览这本维基百科时,它给出了以下示例: "abbc".replace(/(.)\1/g, "$1") => "abc" 我不知道为什么这是真的(维基百科没有真正解释),但我自己尝试过,它确实去掉了第二个b。我知道\1是对捕获的组(.)的反向引用,但是。除了一个新行符号外,还有其他字符吗。。。这不也是第二个b吗?尝试一些变化也不能解决问题 "abbc".replace(/(.)/

我正在尝试学习正则表达式,目前我已经从W3、Mozilla或其他网站的所有概述中获得了一个非常基本的理解,但当我浏览这本维基百科时,它给出了以下示例:

"abbc".replace(/(.)\1/g, "$1") => "abc"
我不知道为什么这是真的(维基百科没有真正解释),但我自己尝试过,它确实去掉了第二个b。我知道\1是对捕获的组(.)的反向引用,但是。除了一个新行符号外,还有其他字符吗。。。这不也是第二个b吗?尝试一些变化也不能解决问题

"abbc".replace(/(.)/g, "$1") => "abbc"
"aabc".replace(/(.)*/g, "$1") => "c"

有人有关于Javascript正则表达式的深入教程吗(我看过几本书,它们非常通用于大约15种语言,没有真正强调Javascript)。

第一本

  • (.)
    匹配并捕获组1中的单个字符,因此
    ()\1
    匹配两个相同的字符,例如
    AA
  • 在字符串中,此模式的唯一匹配项是
    bb
  • 通过将这两个字符
    bb
    替换为组1捕获缓冲区
    $1
    ,即
    b,我们将两个字符替换为一个,有效地删除了一个
    b`
第二个

  • 再次
    ()
    匹配并捕获单个字符,将其捕获到组1
  • 模式依次匹配字符串中的每个字符
  • 替换的是组1捕获缓冲区
    $1
    ,因此我们将每个字符替换为自身。因此,字符串保持不变
第三个

  • 在这里,暂时忘记括号,
    *
    匹配整个字符串:这是匹配
  • 量词
    *
    表示每次匹配单个字符时,组1都会重置(不会创建新的组号,因为组编号是从左到右进行的)
  • 因此,对于匹配的每个字符,该字符将被捕获到组1,直到下一次捕获重置组1
  • 组1的结束值是最后一次捕获的值,即最后一个字符
    c
  • 我们将匹配项(即整个字符串)替换为组1(即
    c
    ),因此替换字符串为
    c
小组编号的细节非常重要,我强烈建议您阅读有关“血淋淋的细节”的链接文章

参考


    • 第一个

      • (.)
        匹配并捕获组1中的单个字符,因此
        ()\1
        匹配两个相同的字符,例如
        AA
      • 在字符串中,此模式的唯一匹配项是
        bb
      • 通过将这两个字符
        bb
        替换为组1捕获缓冲区
        $1
        ,即
        b,我们将两个字符替换为一个,有效地删除了一个
        b`
      第二个

      • 再次
        ()
        匹配并捕获单个字符,将其捕获到组1
      • 模式依次匹配字符串中的每个字符
      • 替换的是组1捕获缓冲区
        $1
        ,因此我们将每个字符替换为自身。因此,字符串保持不变
      第三个

      • 在这里,暂时忘记括号,
        *
        匹配整个字符串:这是匹配
      • 量词
        *
        表示每次匹配单个字符时,组1都会重置(不会创建新的组号,因为组编号是从左到右进行的)
      • 因此,对于匹配的每个字符,该字符将被捕获到组1,直到下一次捕获重置组1
      • 组1的结束值是最后一次捕获的值,即最后一个字符
        c
      • 我们将匹配项(即整个字符串)替换为组1(即
        c
        ),因此替换字符串为
        c
      小组编号的细节非常重要,我强烈建议您阅读有关“血淋淋的细节”的链接文章

      参考


      这在分解时非常简单:

      With "abbc".replace(/(.)\1/g, "$1"), the result is "abc" because:
      (.) references one character.
      \1 references the first back reference
      

      所以,它说的是“找到两个相同的字母”,并用引用替换它。因此,任何双精度字符都将匹配并被引用替换。

      分解时,这非常简单:

      With "abbc".replace(/(.)\1/g, "$1"), the result is "abc" because:
      (.) references one character.
      \1 references the first back reference
      

      所以,它说的是“找到两个相同的字母”,并用引用替换它。因此,任何加倍的字符都将匹配并被引用替换。

      准确地说,在第三个字符中,
      (.)*
      依次匹配每个单个字符,因此每个字符都会在短时间内成为
      $1
      。@Jongware是的,没错。我添加了一篇关于组编号的优秀文章。仅供参考,您询问了其他资源,其中两篇链接文章来自一个网站,应该可以补充您已经看到的内容。非常感谢,这个深入的解释真的很有帮助。出于某种原因,我认为第二个表达式,为了给出它所做的输出,需要写成
      “abbc”。替换(/(.*)/g,“$1”)=>“abbc”
      ,按照它的编写方式,它似乎应该只返回“a”,而不是整个字符串…+1,因为答案中有很多细节@用户3334776:你能通过点击我答案左上角的勾号将答案标记为已接受吗?准确地说,在第三个选项中,
      ()*
      依次匹配每个字符,因此每个字符在短时间内都是
      $1
      。@Jongware是的,没错。我添加了一篇关于组编号的好文章。仅供参考,您询问了其他资源,其中两篇链接文章来自一个网站,应该可以补充您已经看到的内容。非常感谢您