ActionScript编程  非贪婪模式
作用:
定义正则表达式对字符串的匹配方式,使之匹配尽可能少的范围或次数。
说明:
在正则表达式中,经常会使用一些元字符来修饰某些表达式的匹配次数。有些元字符可以使某个表达式匹配不定数量的次数,通常这些元字符会使正则表达式尽可能多地匹配结果,显得十分“贪婪”,因此这种模式被称作贪婪模式。贪婪模式使用的元字符如表11-5所示。
表11-5  贪婪模式的元字符
元字符
说明
元字符
说明
0次或1次
*
0次或更多次
+
1次或更多次
{n,}
至少n次
{n,m}
至少n次,但不超过m次
贪婪模式是在正则表达式中默认的模式,但是这种模式往往使正则表达式匹配出超过用户需要的字符。因此,人们定义了与贪婪模式相对应的非贪婪模式。在非贪婪模式下,正则表达式将会匹配尽可能少的次数。
假设,一个字符串中包含3个符合某正则表达式的子字符串,在贪婪模式下,将可以匹配3次。而在非贪婪模式下则可能只匹配1次。
将贪婪模式转换为非贪婪模式并不麻烦,只需要在贪婪模式的元字符后添加一个问号“?”即可。例如,在星号“*”元字符后添加一个问号“?”,使之变成“*?”。在添加问号“?”之后,该元字符代表匹配的范围仍然是0次到无限多次,但是能匹配0次,就决不匹配1次或1次以上,同理,能匹配1次,决不匹配两次或两次以上,依此类推。
示例:
贪婪模式和非贪婪模式各有用途。默认情况下,大多数正则表达式都属于贪婪模式。然而,有些情况下,贪婪模式并不适用。例如,需要将1段XHTML代码通过replace()方法转换为不包含XHTML标签的文本,如下所示。
var poemtext:String="<h1>登鹳雀楼</h1><br /><h2>李白</h2><br /><span>白日依山尽</span><br /><sp
an>黄河入海流</span><br /><span>欲穷千里目</span><br /><span>更上一层楼</span>"
在上面的代码中包含了多种XHTML的标签,例如,h1、h2、br等。根据XHTML标签必须以尖括号“<>”括起来的原则,多数用户会编写正则表达式以对其进行匹配,如下所示。
var xRegExp:RegExp=/<.*>/g;
用户可以将上面的正则表达式代入replace()方法进行替换,并测试结果,入下所示。
正则匹配标签place(xRegExp,""));
执行上面的代码,即可发现,ActionScript并没有输出任何文本。因为replace()方法根据xRegExp正则表达式,在贪婪模式下,已将第1个前尖括号“<”和最后1个后尖括号“>”之间所有的内容都列入了匹配项中,并将其替换为了空字节。
为了进一步验证这种猜想是否正确,用户可以试着将符合正则表达式的内容替换为任意文本,例如,数字1,如下所示。
place(xRegExp,"1"));
执行上面的代码,ActionScript将会输出1个数字1,这种情况说明,在替换某些特殊的内容时,不适合使用贪婪模式,而应使用非贪婪模式。例如,对xRegExp正则表达式进行非贪婪模式的改进,如下所示。
var uRegExp:RegExp=/<.*?>/g;
将uRegExp正则表达式代入到replace()方法中,即可输出新的替换结果,如下所示。
place(uRegExp,""));
执行上面的代码,即可发现,已正常地替换了所有XHTML的标签,如下所示。
登鹳雀楼李白白日依山尽黄河入海流欲穷千里目更上一层楼

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。