标志和属性

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

下表列出了可以为正则表达式设置的五种标志。每种标志都可以作为正则表达式对象属性进行访问。

标志

属性

说明

g

global

匹配多个匹配。

i

ignoreCase

不区分大小写的匹配。应用于 A-Za-z 字符,但不能应用于扩展字符,如 Éé

m

multiline

设置此标志后,$^ 可以分别匹配行的开头和结尾。

s

dotall

设置此标志后,.(点)可以匹配换行符 (\n)。

x

extended

允许扩展的正则表达式。您可以在正则表达式中键入空格,它将作为模式的一部分被忽略。这可使您更加清晰可读地键入正则表达式代码。

请注意这些属性都是只读属性。您在设置正则表达式变量时,可以设置标志(gimsx),如下所示:

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-Za-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) 标志

如果没有设置 sdotall 或“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