替换和子表达式

正则表达式中的替换允许您对两个或多个替换选项之间的选择进行分组。 实际上可以在模式中指定“this OR that”。

子表达式允许您匹配搜索文本中的模式并将匹配项分成多个单独的子匹配项。 程序可检索生成的子匹配项。 子表达式还允许您重新设置文本格式,如 JScript 中的反向引用中所述。

有关正则表达式的更多信息,请参见 创建正则表达式正则表达式语法

替换

可以使用管道 (|) 字符指定两个或多个替换选项之间的选择。 这称为“替换”。 匹配管道字符任一侧最大的表达式。 您可能认为,下面的 JScript 表达式匹配后跟一个或两个数字的“Chapter”或“Section”。

/Chapter|Section [1-9][0-9]{0,1}/

相反,正则表达式匹配后跟任何数字的单词“Chapter”或单词“Section”。 如果搜索字符串是“Section 22”,那么该表达式匹配“Section 22”。 但是,如果搜索字符串是“Chapter 22”,那么表达式匹配单词“Chapter”,而不是匹配“Chapter 22”。

带括号的替换

可以使用括号来限制替换的范围,即,确保它只应用于两个单词“Chapter”和“Section”。 可以通过添加括号来使正则表达式匹配“Chapter 1”或“Section 3”。

但是,括号还用于创建子表达式。 程序可检索生成的子匹配项。

下面的 JScript 正则表达式使用括号来组合“Chapter”和“Section”。 然后,可能的匹配项将包括后跟一个数字的“Chapter”。

/(Chapter|Section) [1-9][0-9]{0,1}/

Chapter|Section 周围的括号还将保存两个匹配字中的任一个供以后使用。

下面的示例演示如何在代码中检索匹配项和子匹配项。 由于在表达式中只有一组括号,因此,只有一个被保存的子匹配项。

var re = /(Chapter|Section) [1-9][0-9]{0,1}/g
var src = "Chapter 50  Section 85"
ShowMatches(src, re);

// Output:
//  Chapter 50
//  submatch 1: Chapter

//  Section 85
//  submatch 1: Section

// Perform a search on a string by using a regular expression,
// and display the matches and submatches.
function ShowMatches(src, re)
{
    var result;

    // 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);
    }
}

不带保存的子匹配项的替换

在上一示例中,您只需要使用括号来组合单词“Chapter”和“Section”之间的选择。

若要防止子匹配项被保存以备将来使用,可以指定子表达式 (?:pattern)。 下面的示例和前一个示例执行的是同样的操作,但它不保存子匹配项。

var re = /(?:Chapter|Section) [1-9][0-9]{0,1}/g
var src = "Chapter 50  Section 85"
ShowMatches(src, re);
// Output:
//  Chapter 50
//  Section 85

子表达式

在正则表达式中放置括号可创建子表达式。 程序可检索生成的子匹配项。

在下面的示例中,正则表达式包含三个子表达式。 子匹配字符串与每个匹配项一起显示。

var re = /(\w+)@(\w+)\.(\w+)/g
var src = "Please send mail to george@contoso.com and someone@example.com. Thanks!"
ShowMatches(src, re);
// The ShowMatches function is provided earlier.

// Output:
//  george@contoso.com
//  submatch 1: george
//  submatch 2: contoso
//  submatch 3: com

//  someone@example.com
//  submatch 1: someone
//  submatch 2: example
//  submatch 3: com

下面的示例将通用资源指示符 (URI) 分解为其组件。

第一个括号子表达式保存 Web 地址的协议部分。 它匹配在冒号和两个正斜杠前面的任何单词。 第二个括号子表达式保存地址的域地址部分。 它匹配不包括左斜线 (/) 或冒号 (:) 字符的任何字符序列。 第三个括号子表达式保存网站端口号(如果指定了的话)。 它匹配冒号后面的零个或多个数字。 第四个括号子表达式保存 Web 地址指定的路径和/或页信息。 它匹配零个或多个数字字符 (#) 或空白字符之外的字符。

var re = /(\w+):\/\/([^\/:]+)(:\d*)?([^# ]*)/gi;
var src = "https://msdn.microsoft.com:80/scripting/default.htm";
ShowMatches(src, re);

// Output:
//  https://msdn.microsoft.com:80/scripting/default.htm
//  submatch 1: http
//  submatch 2: msdn.microsoft.com
//  submatch 3: :80
//  submatch 4: /scripting/default.htm

正预测先行和负预测先行

正预测先行是一类搜索,其中在找到一个匹配项后,将在匹配的文本之前开始搜索下一个匹配项。 不会保存匹配项以备将来之用。 若要指定正预测先行,请使用语法 (?=pattern)。

在下面的示例中,执行了搜索以确定密码的长度是否介于 4 到 8 个字符之间,并且至少包含一个数字。

在正则表达式中,.*\d 查找后跟一个数字的任意多个字符。 对于搜索字符串“abc3qr”,这与“abc3”匹配。 从该匹配项之前(而不是之后)开始,.{4,8} 与包含 4 到 8 个字符的字符串匹配。 这与“abc3qr”匹配。

^ 和 $ 指定搜索字符串的开始和结束位置。 这将在搜索字符串包含匹配字符之外的任何字符时阻止匹配。

var re = /^(?=.*\d).{4,8}$/gi
var src = "abc3qr"
ShowMatches(src, re);
// The ShowMatches function is provided earlier.
// Output:
//  abc3qr

负预测先行将搜索与消极的预测先行表达式中的模式不匹配的搜索字符串。 找到一个匹配项后,将在匹配文本之前开始搜索下一个匹配项。 不会保存匹配项以备将来之用。 若要指定负预测先行,请使用语法 (?!pattern)。

下面的示例匹配不以“th”开头的单词。

在正则表达式中,\b 将匹配单词边界。 对于搜索字符串“ quick ”,这与第一个空格匹配。 (?!th) 与非“th”字符串匹配。 这与“qu”匹配。 从该匹配项开始,\w+ 与一个字匹配。 这与“quick”匹配。

var re = /\b(?!th)\w+\b/gi
var src = "The quick brown fox jumps over the lazy dog."
ShowMatches(src, re);
// Output:
//  quick
//  brown
//  fox
//  jumps
//  over
//  lazy
//  dog

请参见

概念

JScript 中的反向引用

其他资源

正则表达式介绍