下表列出了可以为正则表达式设置的五种标志。每种标志都可以作为正则表达式对象属性进行访问。
标志
|
属性
|
说明
|
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