JScript 中的反向引用

反向引用用于查找重复字符组。 此外可使用反向引用来重新排列输入字符串中各个元素的顺序和位置,以重新设置输入字符串的格式。

可以从正则表达式和替换字符串中引用子表达式。 每个子表达式都由一个编号来标识,并称作反向引用。

正则表达式中的括号用于创建子表达式。 程序可检索生成的子匹配项。 有关更多信息,请参见替换和子表达式

使用反向引用

可以从正则表达式中引用子表达式。

在正则表达式中,每个保存的子匹配项按照它们从左到右出现的顺序存储。 用于存储子匹配项的缓冲区编号从 1 开始,最多可存储 99 个子表达式。 在正则表达式中,可以使用 \n 来访问每个缓冲区,其中 n 是标识特定缓冲区的一位或两位十进制数字。

反向引用的一个应用是,提供查找文本中两个相同的单词的匹配项的能力。 以下面的句子为例:Is is the cost of of gasoline going up up?

该句子包含多个重复的单词。 如果能设计一种方法定位该句子,而不必查找每个单词的重复出现,则会很有用。 下面的 JScript 正则表达式使用单个子表达式来实现这一点。

/\b([a-z]+) \1\b/gi

在此情况下,子表达式是括在括号中的所有内容。 该子表达式包括由 [a-z]+ 指定的一个或多个字母字符。 正则表达式的第二部分是对以前保存的子匹配项的引用,即,单词的第二个匹配项正好由括号表达式匹配。 \1 用于指定第一个子匹配项。

\b 单词边界元字符确保只检测单独的单词。 否则,诸如“is issued”或“this is”之类的词组将不能正确地被此表达式识别。

下面的示例列出了重复的单词。 它演示如何在代码中检索匹配项和子匹配项。

var result;

var re = /\b([a-z]+) \1\b/gi
var src = "Is is the cost of of gasoline going up up?"

// Get the first match.
result = re.exec(src);

while (result != null)
{
    // Show the entire match.
    print();
    print(result[0]);

    // Show the submatches.
    for (var index = 1; index < result.length; index++)
    {
        print("submatch " + index + ": " + result[index]);
    }

    // Get the next match.
    result = re.exec(src);
}

// Output:
//  Is is
//  submatch 1: Is

//  of of
//  submatch 1: of

//  up up
//  submatch 1: up

还可以从替换字符串中引用子表达式。

通过使用上面显示的正则表达式,下面的示例可将两个连续相同的单词的匹配项替换为同一单词的单个匹配项。 在 replace 方法中,$1 引用第一个保存的子匹配项。 如果有多个子匹配项,则按照 $2、$3 等这一方式依次引用它们。

var re = /\b([a-z]+) \1\b/gi
var src = "Is is the cost of of gasoline going up up?"
var result = src.replace(re, "$1");
print(result);
// Output:
//  Is the cost of gasoline going up?

下面的示例将字符串中的每对单词进行了交换:

var re = /(\S+)(\s+)(\S+)/gi
var src = "The quick brown fox jumps over the lazy dog."
var result = src.replace(re, "$3$2$1");
print(result);
// Output:
//  quick The fox brown over jumps lazy the dog.

请参见

参考

replace 方法

概念

替换和子表达式

其他资源

正则表达式介绍