组Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本 您可以使用括号在正则表达式中指定组,如下所示: /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 = "[email protected]"; trace(pattern.exec(str)); // [email protected],bob,example,com 使用非捕获组和向前查找组非捕获组是只用于分组的组,它不会被“收集”,也不会匹配有限的逆向引用。可以使用 (?: 和 ) 来定义非捕获组,如下所示: var pattern = /(?:com|org|net); 例如,注意在捕获组和非捕获组中加入 (com|org) 的区别(exec() 方法在完全匹配后列出捕获组): var pattern:RegExp = /(\w+)@(\w+).(com|org)/; var str:String = "[email protected]"; trace(pattern.exec(str)); // [email protected],bob,example,com //noncapturing: var pattern:RegExp = /(\w+)@(\w+).(?:com|org)/; var str:String = "[email protected]"; trace(pattern.exec(str)); // [email protected],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 = "[email protected]"; var result:Array = emailPattern.exec(address); trace(result.name); // bob trace(result.dom); // example 注: 命名组不属于 ECMAScript 语言规范。它们是 ActionScript 3.0 中的新增功能。
|
|