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