繁体   English   中英

正则表达式中的$ 0和$ 1

[英]$0 and $1 in Regular Expression

我正在尝试使用带有正则表达式的replace,并且需要一些帮助来理解$ 1在此代码中的含义。 这段代码是用来交换大小写的。

return str.replace(/([a-z])|([A-Z])/g,
    function($0, $1)
    { return ($1) ? $0.toUpperCase() : $0.toLowerCase(); })

我知道在replace方法的第一个参数中,我会检查我们是否具有小写或大写字母,但是我不明白具有第二个参数的方式和作用。

我理解如果($ 1)为true的语法,我们执行$ 0.toUpperCase(),否则执行$ 0.toLowerCase()。 但是,如何从($ 1)为真来决定呢? ($ 1)有什么条件? 我想我明白$ 0是整个匹配的字符串。 但是我对($ 1)感到困惑。 谢谢!

($ 1)有什么条件?

无-正则表达式语法没有指定如何评估匹配组的真实性,因此这取决于所包含语言的行为。

我猜想,在这种情况下,它会将空字符串评估为假,将非空字符串评估为真-但由于您没有告诉我们这是什么语言,因此无法确定。

$0确实是整个匹配的字符串。 $1是第一个子模式(即小写字母)。 如果第一个子模式匹配,则将其大写,否则将其小写。 应该注意的是,该函数被赋予了另一个参数,但是在这种情况下不使用它。

注意传递给评估器的参数 按照给定的模式,我将其重写为:

str.replace(/([a-z])|([A-Z])/g,
  function(match, p1, p2) {
    return p1 ? p1.toUpperCase() : p2.toLowerCase();
  })

如果([az])匹配,则绑定的p1$1 )变量将求值为真字符串(任何不为空的字符串;特别是正则表达式接受的字符串); 否则, p1将为空字符串"" (这是一个伪造的值)。 这就是为什么对p1$1 )的检查正确的原因-请注意,绑定的捕获组始终具有字符串类型。

请注意,您没有必要检查match$0 ),因为它永远不会是什么,而是带有正则表达式的真实(它将是第一个或第二个替换子表达式)。

在此示例中,$ 0和$ 1只是变量(使用匈牙利符号表示)。 您可以轻松地用a和b替换它们,并且代码的工作原理相同。 该函数用许多参数调用。 第一个参数是匹配的子字符串。 第二个参数是第一个捕获(与第一个括号中的正则表达式匹配的任何字符,在这种情况下为单个小写字母az)。 第三个(丢失)参数将是第二个捕获(匹配大写字母AZ),但请注意,此参数将被忽略。

因为正则表达式使用全局“ g”标志,所以该函数(可能)多次调用。 正则表达式匹配任何小写或大写字母。 第一个功能参数将从str开始连续匹配每个字符,而第二个参数仅在第一个捕获组匹配时设置-这意味着第二个功能参数仅在字符为小写时设置 如果设置了第二个参数(即,这是一个小写字符),则在匹配项上调用toUpperCase函数。 如果未设置第二个参数(即,这是一个大写字符),则在匹配项上调用toLowerCase函数。 在后一种情况下,未使用的第三参数包含第二捕获组内容。

整个解决方案具有逐个字符交换大小写的效果。

但是..在此代码中使用$ 0和$ 1意味着创建者在玩弄其他东西:引用和反向引用。 $ 0(或某些语言中的\\ 0)是对匹配项的引用(即,它恰好是该函数的第一个参数),$ 1(或\\ 1)是对第一个捕获组的引用,以此类推。如此命名变量以支持第一个参数等效于$ 0,第二个参数等效于$ 1的概念,依此类推。在我看来,这是开明的,并且完全令人困惑。 这些变量名的使用表明发生了一些不可思议的事情。 匈牙利表示法的使用还意味着其他含义。 这里没有什么魔术,因此变量应该更简单地命名-match和is_lowercase会很好。

此外,由于缺少第三个函数自变量,因此无需捕获大写字符类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM