您可以使用括号在正则表达式中指定组,如下所示:
/class-(\d*)/
组是模式的子部分。您可以使用组实现以下操作:
下面几节将介绍有关这些组用法的详细信息。
使用带数量表示符的组
如果不使用组,数量表示符将应用到它前面的字符或字符类,如下所示:
var pattern:RegExp = /ab*/ ;
// matches the character a followed by
// zero or more occurrences of the character b
pattern = /a\d+/;
// matches the character a followed by
// one or more digits
pattern = /a[123]{1,3}/;
// matches the character a followed by
// one to three occurrences of either 1, 2, or 3
然而,您可以使用组将数量表示符应用到多个字符或字符类:
var pattern:RegExp = /(ab)*/;
// matches zero or more occurrences of the character a
// followed by the character b, such as ababab
pattern = /(a\d)+/;
// matches one or more occurrences of the character a followed by
// a digit, such as a1a5a8a3
pattern = /(spam ){1,3}/;
// matches 1 to 3 occurrences of the word spam followed by a space
有关数量表示符的详细信息,请参阅
数量表示符
。
使用带逻辑“或”字符 (|) 的组
可以使用组来定义一组要应用逻辑“或”字符 (
|
) 的字符,如下所示:
var pattern:RegExp = /cat|dog/;
// matches cat or dog
pattern = /ca(t|d)og/;
// matches catog or cadog
使用组捕获子字符串匹配
如果您在模式中定义标准括号组,则之后可以在正则表达式中引用它。这称为“逆向引用”,并且此类型的组称为“捕获组”。例如,在下面的正则表达式中,序列
\1
匹配在捕获括号组中匹配的任意子字符串:
var pattern:RegExp = /(\d+)-by-\1/;
// matches the following: 48-by-48
您可以通过键入
\1
、
\2
、...、
\99
在正则表达式中最多指定 99 个此类逆向引用。
类似地,在 String 类的
replace()
方法中,可以使用
$1-$99
在替换字符串中插入捕获的组子字符串匹配:
var pattern:RegExp = /Hi, (\w+)\./;
var str:String = "Hi, Bob.";
trace(str.replace(pattern, "$1, hello."));
// output: Bob, hello.
此外,如果使用捕获组,RegExp 类的
exec()
方法和 String 类的
match()
方法将返回与捕获组匹配的子字符串:
var pattern:RegExp = /(\w+)@(\w+).(\w+)/;
var str:String = "bob@example.com";
trace(pattern.exec(str));
// bob@example.com,bob,example,com
使用非捕获组和向前查找组
非捕获组是只用于分组的组,它不会被“收集”,也不会匹配有限的逆向引用。可以使用
(?:
和
)
来定义非捕获组,如下所示:
var pattern = /(?:com|org|net);
例如,注意在捕获组和非捕获组中加入
(com|org)
的区别(
exec()
方法在完全匹配后列出捕获组):
var pattern:RegExp = /(\w+)@(\w+).(com|org)/;
var str:String = "bob@example.com";
trace(pattern.exec(str));
// bob@example.com,bob,example,com
//noncapturing:
var pattern:RegExp = /(\w+)@(\w+).(?:com|org)/;
var str:String = "bob@example.com";
trace(pattern.exec(str));
// bob@example.com,bob,example
一类特殊的非捕获组是“向前查找组”,它包括两种类型:“正向前查找组”和“负向前查找组”。
使用
(?=
和
)
定义正向前查找组,它指定组中的子模式位置必须匹配。但是,匹配正向前查找组的字符串部分可能匹配正则表达式中的剩余模式。例如,由于
(?=e)
在下面的代码中是正向前查找组,它匹配的字符
e
可以被正则表达式的后续部分匹配,在本例中为捕获组
\w*)
:
var pattern:RegExp = /sh(?=e)(\w*)/i;
var str:String = "Shelly sells seashells by the seashore";
trace(pattern.exec(str));
// Shelly,elly
使用
(?!
和
)
定义负向前查找组,它指定该组中的子模式位置不得匹配。例如:
var pattern:RegExp = /sh(?!e)(\w*)/i;
var str:String = "She sells seashells by the seashore";
trace(pattern.exec(str));
// shore,ore
使用命名组
命名组是正则表达式中给定命名标识符的一类组。使用
(?P<name>
和
)
可定义命名组。例如,下面的正则表达式包含标识符命名为
digits
的命名组:
var pattern = /[a-z]+(?P<digits>\d+)[a-z]+/;
如果使用
exec()
方法,将添加一个匹配的命名组作为
result
数组属性:
var myPattern:RegExp = /([a-z]+)(?P<digits>\d+)[a-z]+/;
var str:String = "a123bcd";
var result:Array = myPattern.exec(str);
trace(result.digits); // 123
这里还有一个例子,它使用两个命名组,标识符分别为
name
和
dom
:
var emailPattern:RegExp =
/(?P<name>(\w|[_.\-])+)@(?P<dom>((\w|-)+))+\.\w{2,4}+/;
var address:String = "bob@example.com";
var result:Array = emailPattern.exec(address);
trace(result.name); // bob
trace(result.dom); // example
注:
命名组不属于 ECMAScript 语言规范。它们是 ActionScript 3.0 中的新增功能。