15.15.如何使用逆向引用?

15.15.1 问题
有些情况下, 如果你想对一个模式进行匹配及根据这个结果来找出下一个可能匹配之处。举例说, 对HTML 标签进行匹配的话, 应怎么办呢?
15.15.2 解答
可以在正则表达式中加入逆向引用来检查最近的匹配结果。
15.15.3 讨论
在Flash Player 的正则表达式处理引擎中, 逆向引用的结果会以一个列表的形式储存,最多可以储存达99 个的相配结果。在其中, “\1”表示最近的匹配结果, 而”\2”则表示前一个结果。同样地, 在String 类中有个叫replace 的方法, 是用来对其他的正则表达式进行匹配的。在这里,最近的匹配结果会以”$1”来表示。

为了确保每对的HTML 标签都会被匹配(例如: <h2>和</h2>), 以下的例子使了”\1”这个逆向引用标记来返回最近的结果:
代码如下:
+展开
-ActionScript
private var headerBackreference:RegExp = /<H([1-6])>.*?<\/H\1>/g;
private function init():void {
var s:String = "<BODY> <H2>Valid Chocolate</H2> <H2>Valid
Vanilla</H2> <H2>This is not valid HTML</H3></BODY>";
var a:Array = s.match(headerBackreference);
if(a != null) {
for(var i:int = 0; i<a.length; i++) {
trace(a[i]);
}
}
}

此外, 你也可以使用逆向引用来为有效的URL 地址加入”<a>”卷标以创建一个超链接。这种逆向引用的表示方法跟之前的会有一点点分别。我们会通过以下的代码及分析来理解它们的分别:
代码如下:
+展开
-ActionScript
private var domainName:RegExp = /(ftp|http|https|file):\/\/[\S]+(\b|$)/gim;
private function matchDomain():void {
var s:String = "Hello my domain is http://www.bar.com, but I a lso like http://foo.net as well as www.baz.org";
var replacedString = (s.replace(domainName, '<a href="$&">$&</a>').replace(/([^\/])(www[\S]+(\b|$))/gim, '$1<a href="http://$2">$2</a>'));
}

首先对有效的URL 地址进行匹配:
/(ftp|http|https|file):\/\/[\S]+(\b|$)/gim;
接受, 把这些有效的URL 地址嵌入”<a>”标记中间:
+展开
-ActionScript
s.replace(domainName, '<a href="$&">$&</a>')

最后, 你会得出以下结果:
代码如下:
Hello my domain is <a href="http://www.bar.com">http://www.bar.com</a>, but I also like <a href="http://foo.net">http://foo.net</a> as well as www.baz.org
显然地, 这个结果并不合乎理想。在原先的RegExp 中, 只有那些以ftp, http, https 或file 开头的字符串才会被匹配, 而www.baz.org 这个字符串则不合乎条件。以下的replace 语句会在所有匹配结果中, 寻找那些包含”www”但没有”/”号在它跟前的字符串。
+展开
-ActionScript
replace(/([^\/])(www[\S]+(\b|$))/gim,'$1<a href="http://$2">$2</a>'))

“$1”及”$2”表示第一及第二个匹配结果, 而在这里第二个结果正是我们所需要的URL 名字。

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


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