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));
例:
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
例:
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
这个属性要和 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
例:
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
;
}
}
}
171

被折叠的 条评论
为什么被折叠?



