此示例中的 $0 和 $1 只是变量(使用匈牙利符号命名)。您可以轻松地将它们替换为 a 和 b,并且代码的工作方式相同。使用许多参数调用该函数。第一个参数是匹配的子字符串。第二个参数是第一个捕获(与第一个括号中的正则表达式匹配的任何内容,在本例中为单个小写字母 az)。第三个(缺失)参数将是第二个捕获(匹配大写字母 AZ),但请注意,这将被忽略。
因为正则表达式使用全局“g”标志,所以(可能)多次调用该函数。正则表达式匹配任何小写或大写字母。第一个函数参数将从 str 开始连续匹配每个字符,并且仅当匹配第一个捕获组时才设置第二个参数 - 这意味着仅当字符为小写时才设置第二个函数参数。如果设置了第二个参数(即这是一个小写字符),则在匹配时调用 toUpperCase 函数。如果第二个参数未设置(即这是一个大写字符),则在匹配时调用 toLowerCase 函数。在后一种情况下,未使用的第三个参数将包含第二个捕获组内容。
整个解决方案具有逐个字符交换大小写的效果。
但是.. 在这段代码中使用 $0 和 $1 表明创建者正在玩弄别的东西:引用和反向引用。$0(或在某些语言中为\0)是对匹配的引用(即它恰好是函数的第一个参数),$1(或\1)是对第一个捕获组的引用,等等。此代码的作者这样命名变量以支持第一个参数等价于 $0 和第二个参数等价于 $1 的概念,等等。在我看来,这是有启发性的并且完全令人困惑。这些变量名称的使用表明正在发生一些神奇的事情。匈牙利记法的使用还暗示着别的东西。这里没有什么神奇之处,因此变量应该更简单地命名 - match 和 is_lowercase 会很好。
此外,由于缺少第三个函数参数,因此无需捕获大写字符类。