下表列出您可以為規則運算式設定的五種旗標。每種旗標都可當做規則運算式物件的屬性加以存取。
旗標
|
屬性
|
說明
|
g
|
global
|
比對一個以上的相符項目。
|
i
|
ignoreCase
|
不區分大小寫的相符。套用至 A—Z 以及 a—z 字元,但不套用至擴充字元,如 É 和 é。
|
m
|
multiline
|
若設定這個旗標,$ 和 ^ 就能分別比對行的開頭與結尾。
|
s
|
dotall
|
若設定這個旗標,. (點) 就能比對新行字元 (\n)。
|
x
|
extended
|
允許擴充的規則運算式。您可以在規則運算式中輸入空格,這些空格會被視為模式的一部分而予以忽略。這樣可以讓您以更容易辨識的方式輸入規則運算式程式碼。
|
請注意,這些是唯讀屬性。在您設定規則運算式變數時,可以設定旗標 (g、i、m、s 以及 x),如下所示:
var re:RegExp = /abc/gimsx;
然而,您不能直接設定已命名的屬性。例如,下列程式碼會造成錯誤:
var re:RegExp = /abc/;
re.global = true; // This generates an error.
根據預設,您必須在規則運算式宣告中加以設定,否則便無法設定旗標,而相對應的屬性也會設定為 false。
另外,規則運算式還有兩項屬性:
g (global) 旗標
如果 g (global) 旗標「並未」納入其中,規則運算式最多只比對一個項目。例如,如果 g 旗標未納入規則運算式中,String.match() 方法只會傳回一個相符的子字串:
var str:String = "she sells seashells by the seashore.";
var pattern:RegExp = /sh\w*/;
trace(str.match(pattern)) // output: she
設定 g 旗標之後,Sting.match() 方法會傳回多個相符項目,如下所示:
var str:String = "she sells seashells by the seashore.";
var pattern:RegExp = /sh\w*/g;
// The same pattern, but this time the g flag IS set.
trace(str.match(pattern)); // output: she,shells,shore
i (ignoreCase) 旗標
根據預設,規則運算式的相符項目會區分大小寫。若您設定 i (ignoreCase) 旗標,則會忽略大小寫。例如,規則運算式中的小寫 s 不會比對出字串第一個字元的大寫 S:
var str:String = "She sells seashells by the seashore.";
trace(str.search(/sh/)); // output: 13 -- Not the first character
然而設定 i 旗標之後,規則運算式就會比對出大寫字母 S:
var str:String = "She sells seashells by the seashore.";
trace(str.search(/sh/i)); // output: 0
i 旗標只會忽略 A–Z 和 a–z 字元的大小寫,但不包括擴充字元的大小寫,如 É 和 é。
m (multiline) 旗標
若未設定 m (multiline) 旗標,^ 會比對字串開頭,而 $ 會比對字串結尾。若設定了 m 旗標,這些字元會分別比對行的開頭與結尾。以下列包含新行字元的字串為例:
var str:String = "Test\n";
str += "Multiline";
trace(str.match(/^\w*/g)); // Match a word at the beginning of the string.
即使在規則運算式中設定了 g (global) 旗標,match() 方法仍然只比對出一個子字串,因為 ^ 只有一個相符項目 (即字串開頭)。輸出是:
Test
以下是設定了 m 旗標的相同程式碼:
var str:String = "Test\n";
str += "Multiline";
trace(str.match(/^\w*/gm)); // Match a word at the beginning of lines.
這次輸出會包含兩行開頭的文字:
Test,Multiline
請注意,只有 \n 字元會指出行的結尾。下列字元則不會:
歸位 (\r) 字元
Unicode 行分隔 (\u2028) 字元
Unicode 段落分隔 (\u2029) 字元
s (dotall) 旗標
若未設定 s (dotall 或「dot all」) 旗標,規則運算式模式中的點 (.) 不會比對新行字元 (\n)。因此,下列範例中沒有相符項目:
var str:String = "<p>Test\n";
str += "Multiline</p>";
var re:RegExp = /<p>.*?<\/p>/;
trace(str.match(re));
但是若設定了 s 旗標,點就會比對新行字元:
var str:String = "<p>Test\n";
str += "Multiline</p>";
var re:RegExp = /<p>.*?<\/p>/s;
trace(str.match(re));
在此範例中,相符部分是 <p> 標籤中的整個子字串,包括新行字元:
<p>Test
Multiline</p>
x (extended) 旗標
規則運算式可能不易閱讀,尤其當包含大量中繼符號和中繼序列時。例如:
/<p(>|(\s*[^>]*>)).*?<\/p>/gi
若您在規則運算式中使用 x (extended) 旗標,您在模式中輸入的任何空格都會被忽略。例如,下列規則運算式和上個範例完全相同:
/ <p (> | (\s* [^>]* >)) .*? <\/p> /gix
若您已設定 x 旗標,並且確實要比對空格字元,請在空格前加上反斜線。例如,下列兩個運算式是相等的:
/foo bar/
/foo \ bar/x
lastIndex 屬性
lastIndex 屬性指定字串中的索引位置,下次搜尋就是要從這個位置開始。對於將 g 旗標設定為 true 的規則運算式而言,這個屬性會影響在此規則運算式上呼叫的 exec() 和 test() 方法。例如,以下列程式碼為例:
var pattern:RegExp = /p\w*/gi;
var str:String = "Pedro Piper picked a peck of pickled peppers.";
trace(pattern.lastIndex);
var result:Object = pattern.exec(str);
while (result != null)
{
trace(pattern.lastIndex);
result = pattern.exec(str);
}
根據預設,lastIndex 屬性設定為 0 (從字串開頭開始搜尋)。在每次比對相符之後,就會設定到相符項目後的索引位置。因此,上述程式碼的輸出如下所示:
0
5
11
18
25
36
44
如果 global 旗標設定為 false,exec() 和 test() 方法就不會使用或設定 lastIndex 屬性。
String 類別的 match()、replace() 和 search() 方法都會從字串開頭展開所有搜尋,不論用於呼叫方法的規則運算式中的 lastIndex 屬性設定為何 (但是 match() 方法會將 lastIndex 設定為 0)。
您可以設定 lastIndex 屬性,以調整規則運算式之相符字串中的開始位置。
source 屬性
source 屬性指定用來定義規則運算式模式部分的字串。例如:
var pattern:RegExp = /foo/gi;
trace(pattern.source); // foo