正则学习笔记6
问题:将除hr标签外的其他标签去掉,但要保留标签里的内容。
问题:把pub_form_year_01分割为'pub_from_year'和'01'两部分
上面之所以能匹配最后一个"_",而不是其他的"_",是因为'*'、 '+'和 '?' 限定符都是贪婪符,也就是说,他们尽可能多地匹配文字。加之,贪婪量词,本来就是从后面匹配。如果没发现,就去掉最后一个字符再匹配。
当正则表达式中包含能接受重复的量词(指定数量的代码,例如*,{5,12}等)时,通常的行为是匹配尽可能多的字符。考虑这个表达式:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的量词都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab。
上题的其他解法:
正整数:/(?:^|\r\n)\s*(?:\r\n|$)/
问题:有两个这样的变量var s='aa{1}bb,cc{3}dd,dd{0}ee,ee{2}ff';var z=['a','b','c','d'];要求把s字符串中{x}替换成z数组中对应x位置的值。结果s='aabbb,ccddd,ddaee,eecff'
问题:删除所有font 标签。
问题:去掉字串中重复的子字串.
问题:截取<embed src="http://img.ku6.com/common/V2.0.1.swf?vid=l8JX92SeoScVpyaj" type="application/x-shockwave-flash" width="480" height="415"></embed>中的swf后面的参数。
问题:截取<embed 匹配"aaa4444aaaaaa55555-aaaaaa666666aaaa51515aaa"中所有后面不接“-”的4到6位数字。。
贪婪模式与懒惰模式
例子代码,如下: str = "abbb1234abbbaabbbaaabbb1234"; re = /.*bbb/g; alert(str.match(re)); //结果为abbb1234abbbaabbbaaabbb re = /.*?bbb/g; alert(str.match(re)); //结果为abbb,1234abbb,aabbb,aaabbb re = /a*bbb/g; alert(str.match(re)); //结果为abbb,abbb,aabbb,aaabbb re = /a*?bbb/g; alert(str.match(re)); //结果为abbb,abbb,aabbb,aaabbb 对于第一、第二和第四个打印结果容易理解: 第一个str.match(re),贪婪量词先匹配整个字串,若不匹配去掉一个尾字符,继续匹配; 第二个str.match(re),惰性量词从第一个字符开始递加去匹配,直到匹配成功,清空字串,从下一个字符继续匹配。 第四个str.match(re),同第二个。 但第三个就不知道如何解释
解释:http://bbs.51js.com/viewthread.php?tid=74712&extra=&highlight=%D5%FD%D4%F2&page=1 对于第三个正则,就是这样来执行的; 首先清楚了是用了简单量词(*),而我们知道了*是贪婪量词: 贪婪量词执行过程。正好楼主所说的那样。“先匹配整体,若不匹配则去掉尾字符继续匹配,直到成功或者结束” 这样说应说只能得到第一被匹配的对象。 也就是说,只是说了匹配第一个。 (btw 如C# 中Regex类中match方法是返回第一个匹配,而matches搜索正则表达式的所有匹配项) 对于javascript中的match来说。正如C#中的matches一样,返回所有匹配。 对于要返回所有匹配。 它还有第二个步:就是匹配成功后,从最近的一个匹配后的下一个字符开始重新贪婪模式匹配。重新执行它的步骤; 例: str = "abbb1234abbbaabbbaaabbb1234"; re = /a*bbb/g; alert(str.match(re)); 它的执行过程: 第一步:首先整个字符串("abbb1234abbbaabbbaaabbb1234")匹配,发现匹配不成功, 接着。删除最后一个字符("4"),成了("abbb1234abbbaabbbaaabbb123"),这样依次执行下去; 执行。。。最后。发现("abbb")可以被匹配了。。所以生成第一个匹配值。 但在这个match方法中是返回所有匹配。所以.. 第二步:从最近的一个匹配(这里就是第一次匹配了)后的下一个字符开始重新贪婪模式匹配.得到字符串是 ("1234abbbaabbbaaabbb1234"),然后。就按第一步执行。。 执行完第一步后。 然后就从最近一次(这里就是第二次匹配了) ....后面的过程就是重复一二步了。。
对于多个匹配。 只是贪婪模式下发生这样的。而惰性不会发生这样的情况。。因为它们的执行顺序不一样。。 贪婪模式:从右端来删除字符(右到左) 惰性模式:从左端来删除字符(左到右) 所以。贪婪模式,要多匹配时,会重新再次从最近一次匹配结果后的字符串。再一次进行匹配。
正则表达式执行的时候。首先得找到前导字符(a), a是一个普通字符。普通字符,搜索的顺序为从左到右。。 所以搜索“1234abbbaabbbaaabbb1234”字符串时, 得先匹配出a字符来"abbbaabbbaaabbb1234”, 而解析器又发现了a后面是一个贪婪字符。就按贪婪模式去匹配(从右到左。)
问题:匹配<tag>abc</tag><tag>def</tag>中tag标签里面的内容。
问题:将"aa/bb*cc"分割为 aa,bb,cc 。