正则学习笔记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 。

原文地址:https://www.cnblogs.com/rubylouvre/p/1595549.html