旗標和屬性

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

下表列出您可以為規則運算式設定的五種旗標。每種旗標都可當做規則運算式物件的屬性加以存取。

旗標

屬性

說明

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

另外,規則運算式還有兩項屬性:

  • lastIndex 屬性指定字串中的索引位置,以用於下次呼叫規則運算式的 exec() test() 方法。

  • source 屬性指定用來定義規則運算式模式部分的字串。

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