替代和子運算式
規則運算式中的替代可讓您將可選擇的兩個以上替代項目群組在一起。 基本上,您可以指定「這個或那個」模式。
子運算式可讓您在所搜尋的文字中比對某個模式,並將相符項目分割為數個個別的子相符項目。 程式可以擷取產生的子相符項目。 此外,子運算式也可讓您重新格式化文字,如 JScript 的反向參考所述。
如需規則運算式 (Regular Expression) 的詳細資訊,請參閱 建立規則運算式和規則運算式語法。
替代
您可以使用直立線字元 (|) 指定可選擇的兩個以上替代項目。 這稱為「替代」(Alternation)。 會比對直立線字元任一邊可能的最長運算式。 您可能會認為下列 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" 字群組在一起。
若不要儲存子相符項目供日後使用,您可以指定子運算式 (?:<模式>)。 下列範例的作用與上一個範例相同,但不會儲存子相符項目。
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
下列範例會將 Universal Resource Indicator (URI) 細分成數個元件部分。
第一個放在括號內的子運算式會儲存網站位址的通訊協定部分。 它會比對任何出現在冒號和兩個正斜線之前的單字。 第二個放在括號內的子運算式會儲存網址的網域位址部分。 它會比對任何不包含斜線符號 (/) 或冒號 (:) 字元的字元序列。 如果已指定一個網站通訊埠編號,第三個放在括號內的子運算式就會加以儲存。 它會比對接在冒號後的零位以上數字。 第四個放在括號內的子運算式會儲存網站位址所指定的路徑和 (或) 網頁資訊。 它會比對除數字符號字元 (#) 或空白字元外的零個以上字元。
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
右合樣和右不合樣
右合樣 (Positive Lookahead) 是一種搜尋方式,在找到相符項目之後,下一次會從相符文字之前開始搜尋相符項目。 比對不會儲存起來供日後使用。 若要指定右合樣,請使用語法 (?=<模式>)。
在下列範例中,將會執行搜尋以判斷密碼長度是否為 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
右不合樣 (Negative Lookahead) 會搜尋不符合右不合樣運算式中之模式的搜尋字串。 在找到相符項目後,下一次就會從符合的文字前面開始比對。 比對不會儲存起來供日後使用。 若要指定右不合樣,請使用語法 (?!<模式>)。
下列範例會比對不是以 "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