AS3
中的正则表达式
一、
定义方式,可以有两种
var
pattern1:RegExp
=
new
RegExp(
"
test-\\d
"
,
"
i
"
);
var
pattern2:RegExp
=
/
test
-
\d
/
i;
1)
使用
new
来新建一个
RegExp
对象,其中参数为
1
)表达式字符串
2
)表达式的参数,这种方式如果要用
\,
一定要用
\\
来转义。
2)
直接采用
/
形式,以把表达式的内容写到
/……./
里面,在后面跟上表达式的参数,参数字符可以同时添加多个,例如:
/………/gi
二、
参数介绍
1)
Dotall
属性,用
s
字符表示参数,指定字符(
.
)在表达式里是不是匹配新行,如果使用了
s
参数,那就表示
dotall
表示真
例:
var
str:String
=
"
<p>Hello\n
"
+
"
again</p>
"
+
"
<p>Hello</p>
"
;
var
pattern:RegExp
=
/<
p
>
.
*?<
\
/
p
>/
;
trace(pattern.dotall)
//
false
trace(pattern.exec(str));
//
<p>Hello</p>
pattern
=
/<
p
>
.
*?<
\
/
p
>/
s;
trace(pattern.dotall)
//
true
trace(pattern.exec(str));
2)
Extended
属性,用
x
参数表示,指是否在表达式定义的时候是否忽略空格
例:
var
rePhonePattern1:RegExp
=
/
\d
{3}
-
\d
{3}
-
\d
{4}
|
\(\d
{3}
\)\s
?
\d
{3}
-
\d
{4}
/
;
var
str:String
=
"
The phone number is (415)555-1212.
"
;
trace(rePhonePattern1.extended)
//
false
trace(rePhonePattern1.exec(str));
//
(415)555-1212

var
rePhonePattern2:RegExp
=
/
\d
{3}
-
\d
{3}
-
\d
{4}
|
\( \d
{3}
\) \
?
\d
{3}
-
\d
{4}
/
x;
trace(rePhonePattern2.extended)
//
true
trace(rePhonePattern2.exec(str));
//
(415)555-1212
3)
global
属性,用
g
参数表示,指是否用表达式在匹配以后在下次匹配的时候是从头再来还是从上次匹配过的地方开始,其
lastIndex
属性会保存起来。
例:
var
pattern:RegExp
=
/
foo\d
/
;
var
str:String
=
"
foo1 foo2
"
;
trace(pattern.global);
//
false
trace(pattern.exec(str));
//
foo1
trace(pattern.lastIndex);
//
0
trace(pattern.exec(str));
//
foo1
pattern
=
/
foo\d
/
g;
trace(pattern.global);
//
true
trace(pattern.exec(str));
//
foo1
trace(pattern.lastIndex);
//
4
trace(pattern.exec(str));
//
foo2
4)
ignoreCase
属性,用
i
参数表示,指表达式匹配的时候是否区别大小写。
例:
var
pattern:RegExp
=
/
bob
/
;
var
str:String
=
"
Bob bob
"
;
trace(pattern.ignoreCase);
//
false
trace(pattern.exec(str));
//
bob
pattern
=
/
bob
/
i;
trace(pattern.ignoreCase);
//
true
trace(pattern.exec(str));
//
Bob
5)
lastIndex
属性,指定下次查询的起始位置,这个属性影响两个方法
exec()
和
test()
,
match()
,
replace()
,
search()
方法是忽略这个属性的,他们总是从头开始的。
这个属性要和
global
结合使用,当
global
为
true
时,执行
exec()
和
test()
后,
lastIndex
属性会被设置为下一个字符,如果是
false
,则会从头开始。
例:
6)
multiline
属性,用
m
参数表示,指表达式匹配的时候用字符(
^
)和(
$
)分别表示在之前或之后有新的一行。
例:
var
pattern:RegExp
=
/^
bob
/
;
var
str:String
=
"
foo\n
"
+
"
bob
"
;
trace(pattern.multiline);
//
false
trace(pattern.exec(str));
//
null
pattern
=
/^
bob
/
m;
trace(pattern.multiline);
//
true
trace(pattern.exec(str));
//
bob
7)
source
属性,返回表达式的定义字符串。
例:
var
re1:RegExp
=
/
aabb
/
gi;
trace (re1.source);
//
aabb
var
re2:RegExp
=
new
RegExp(
"
x+y*
"
,
"
i
"
);
trace(re2.source);
//
x+y*
三、
方法介绍
1)
Exec()
方法:
i.
输入:传入一个
String
类型的参数,表示要查询的字符串。
ii.
返回:如果没有匹配到就返回
null
,否则返回一个
Object
对象。
这个
Object
对象的属性:
a)
一个
Array
(数组),元素
0
包含一个匹配得到的子串,
1
到
n
包含,其中定义的组所匹配的字符子串
b)
Index
匹配子串在字符串里的位置
c)
Input
输入的原始字符串。
例:
var
myPattern:RegExp
=
/
(\w
*
)sh(\w
*
)
/
ig;
var
str:String
=
"
She sells seashells by the seashore
"
;
var
result:Object
=
myPattern.exec(str);
trace(result);
输出:
result[0]
是”she”
result[1]
是一个空串(第一个\w是匹配到空的子串)
result[2]
是”e”
result.index
是0
result.input
是”
She sells seashells by the seashore”
设置了g(global)属性的例子:
var
myPattern:RegExp
=
/
(\w
*
)sh(\w
*
)
/
ig;
var
str:String
=
"
She sells seashells by the seashore
"
;
var
result:Object
=
myPattern.exec(str);

while
(result
!=
null
)
{
trace ( result.index, "\t", result);
result = myPattern.exec(str);
}
输出:
0 She,,e
10 seashells,sea,ells
27 seashore,sea,ore
2)
Test()
方法:
i.
输入:传入一个
String
类型的参数,表示要查询的字符串。
ii.
返回:如果匹配返回
true
,否则返回
false.
例:
var
re1:RegExp
=
/
\w
/
g;
var
str:String
=
"
a b c
"
;
trace (re1.lastIndex);
//
0
trace (re1.test(str));
//
true
trace (re1.lastIndex);
//
1
trace (re1.test(str));
//
true
trace (re1.lastIndex);
//
3
trace (re1.test(str));
//
true
trace (re1.lastIndex);
//
5
trace (re1.test(str));
//
false
四、
综合例子:
package
{

import flash.display.Sprite;

public class RegExpExample extends Sprite
{

public function RegExpExample()
{
var formalGreeting:String = "Hello, John Smith.";
trace(informalizeGreeting(formalGreeting)); // Hi, John.
var validEmail:String = "name@domain.com";
trace(validateEmail(validEmail)); // true
var invalidEmail:String = "foo";
trace(validateEmail(invalidEmail)); // false
var validPhoneNumber:String = "415-555-1212";
trace(validatePhoneNumber(validPhoneNumber)); // true
var invalidPhoneNumber:String = "312-867-530999";
trace(validatePhoneNumber(invalidPhoneNumber)); // false
}

private function informalizeGreeting(str:String):String
{
var pattern:RegExp = new RegExp("hello, (\\w+) \\w+", "i");
return str.replace(pattern, "Hi, $1");
}

private function validateEmail(str:String):Boolean
{

var pattern:RegExp = /(\w|[_.\-])+@((\w|-)+\.)+\w
{2,4}+/;
var result:Object = pattern.exec(str);

if(result == null)
{
return false;
}
return true;
}

private function validatePhoneNumber(str:String):Boolean
{

var pattern:RegExp = /^\d
{3}-\d
{3}-\d
{4}$/;
var result:Object = pattern.exec(str);

if(result == null)
{
return false;
}
return true;
}
}
}