下表列出您可以為規則運算式設定的五種旗標。每種旗標都可當做規則運算式物件的屬性加以存取。
旗標
|
屬性
|
說明
|
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
字元會指出行的結尾。下列字元則不會:
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