您可以使用括号在正则表达式中指定组,如下所示:

/class-(\d*)/

组是模式的子部分。您可以使用组实现以下操作:

下面几节将介绍有关这些组用法的详细信息。

子主题

使用带数量表示符的组
使用带逻辑“或”字符 (|) 的组
使用组捕获子字符串匹配
使用非捕获组和向前查找组
使用命名组

使用带数量表示符的组

如果不使用组,数量表示符将应用到它前面的字符或字符类,如下所示:

var pattern:RegExp = /ab*/ ;
// 匹配字符 a 后跟
// 零个或多个字符 b

pattern = /a\d+/; 
// 匹配字符 a 后跟
// 一个或多个数字

pattern = /a[123]{1,3}/;
// 匹配字符 a 后跟
// 一到三个 1、2 或 3

然而,您可以使用组将数量表示符应用到多个字符或字符类:

var pattern:RegExp = /(ab)*/;
// 匹配零个或多个字符 a
// 后跟字符 b,如 ababab

pattern = /(a\d)+/;
// 匹配一个或多个 a 后跟
// 数字,例如 a1a5a8a3

pattern = /(spam ){1,3}/; 
// 匹配 1 到 3 个单词 spam 后跟空格

有关数量表示符的详细信息,请参阅数量表示符

使用带逻辑“或”字符 (|) 的组

可以使用组来定义一组要应用逻辑“或”字符 (|) 的字符,如下所示:

var pattern:RegExp = /cat|dog/;
// 匹配 cat 或 dog

pattern = /ca(t|d)og/;
// 匹配 catog 或 cadog

使用组捕获子字符串匹配

如果您在模式中定义标准括号组,则之后可以在正则表达式中引用它。这称为“逆向引用”,并且此类型的组称为“捕获组”。例如,在下面的正则表达式中,序列 \1 匹配在捕获括号组中匹配的任意子字符串:

var pattern:RegExp = /(\d+)-by-\1/;
// 匹配字符串: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."));
// 输出:Bob, hello.

此外,如果使用捕获组,RegExp 类的 exec() 方法和 String 类的 match() 方法将返回与捕获组匹配的子字符串:

var pattern:RegExp = /(\w+)@(\w+).(\w+)/;
var str:String = "bob@example.com";
trace(pattern.exec(str));
  // bob@test.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@test.com,bob,example,com
  
//非捕获:
var pattern:RegExp = /(\w+)@(\w+).(?:com|org)/;
var str:String = "bob@example.com";
trace(pattern.exec(str));
  // bob@test.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

这里还有一个例子,它使用两个命名组,标识符分别为 namedom

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); // 示例

注意

 

命名组不属于 ECMAScript 语言规范。它们是 ActionScript 3.0 中的新增功能。


Flash CS3

 

评论添加到页面后给我发送电子邮件 | 评论报告

当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00000118.html