Flash CS3 文档 |
|||
| ActionScript 3.0 编程 > 使用正则表达式 > 正则表达式语法 > 组 | |||
您可以使用括号在正则表达式中指定组,如下所示:
/class-(\d*)/
组是模式的子部分。您可以使用组实现以下操作:
| 字符)的子模式。\1 以匹配先前匹配的组,或类似地在 String 类的 replace() 方法中使用 $1)。下面几节将介绍有关这些组用法的详细信息。
如果不使用组,数量表示符将应用到它前面的字符或字符类,如下所示:
var pattern:RegExp = /ab*/; // 匹配字符a后跟 // 零个或多个字符bpattern = /a\d+/;// 匹配字符a后跟 // 一个或多个数字pattern = /a[123]{1,3}/; // 匹配字符a后跟 // 一到三个 1、2 或 3
然而,您可以使用组将数量表示符应用到多个字符或字符类:
var pattern:RegExp = /(ab)*/; // 匹配零个或多个字符a// 后跟字符b,如 abababpattern = /(a\d)+/; // 匹配一个或多个a后跟 // 数字,例如 a1a5a8a3pattern = /(spam ){1,3}/;// 匹配 1 到 3 个单词 spam后跟空格
有关数量表示符的详细信息,请参阅数量表示符。
可以使用组来定义一组要应用逻辑“或”字符 (|) 的字符,如下所示:
var pattern:RegExp = /cat|dog/; // 匹配 cat 或 dogpattern = /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
这里还有一个例子,它使用两个命名组,标识符分别为 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); // 示例
|
注意 |
|
命名组不属于 ECMAScript 语言规范。它们是 ActionScript 3.0 中的新增功能。 |
Flash CS3
当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00000118.html