13.8.正则表达式分组

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

/class-(\d*)/
组是模式的子部分。您可以使用组实现以下操作:

将数量表示符应用到多个字符。

界定要应用逻辑“或”(通过使用 | 字符)的子模式。

捕获正则表达式中的子字符串匹配(例如,在正则表达式中使用 \1 以匹配先前匹配的组,或类似地在 String 类的 replace() 方法中使用 $1)。

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

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

+展开
-ActionScript
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

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

+展开
-ActionScript
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

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

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

+展开
-ActionScript
var pattern:RegExp = /cat|dog/; 
// matches cat or dog 
 
pattern = /ca(t|d)og/; 
// matches catog or cadog

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

+展开
-ActionScript
var pattern:RegExp = /(\d+)-by-\1/; 
// matches the following: 48-by-48

您可以通过键入 \1、\2、...、\99 在正则表达式中最多指定 99 个此类逆向引用。

类似地,在 String 类的 replace() 方法中,可以使用 $1-$99 在替换字符串中插入捕获的组子字符串匹配:

+展开
-ActionScript
var pattern:RegExp = /Hi, (\w+)\./; 
var str:String = "Hi, Bob."
trace(str.replace(pattern, "$1, hello.")); 
??// output: Bob, hello.

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

+展开
-ActionScript
var pattern:RegExp = /(\w+)@(\w+).(\w+)/; 
var str:String = "bob@example.com"
trace(pattern.exec(str)); 
??// bob@example.com,bob,example,com

使用非捕获组和向前查找组
非捕获组是只用于分组的组,它不会被“收集”,也不会匹配有限的逆向引用。可以使用 (?: 和 ) 来定义非捕获组,如下所示:

+展开
-ActionScript
var pattern = /(?:com|org|net);

例如,注意在捕获组和非捕获组中加入 (com|org) 的区别(exec() 方法在完全匹配后列出捕获组):

+展开
-ActionScript
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*):

+展开
-ActionScript
var pattern:RegExp = /sh(?=e)(\w*)/i; 
var str:String = "Shelly sells seashells by the seashore"
trace(pattern.exec(str)); 
// Shelly,elly

使用 (?! 和 ) 定义负向前查找组,它指定该组中的子模式位置不得匹配。例如:

+展开
-ActionScript
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 的命名组:

+展开
-ActionScript
var pattern = /[a-z]+(?P<digits>\d+)[a-z]+/;

如果使用 exec() 方法,将添加一个匹配的命名组作为 result 数组属性:

+展开
-ActionScript
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:

+展开
-ActionScript
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 中的新增功能。

加支付宝好友偷能量挖...


评论(0)网络
阅读(70)喜欢(0)flash/flex/fcs/AIR