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

  • 相关阅读:
    分布式事务slides
    为什么jdk中把String类设计成final
    Struts 体系结构与工作原理 图
    在指定路径或者是文件名查找指定的字符串
    Apache Avro 与 Thrift 比较
    SSL请求trustStore的两种注册方式
    java中的split使用的是正则表达式
    所有ghost操作系统大全
    Tomcat帮助文档翻译 未完成
    ORACLE基本配置
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/1595549.html
Copyright © 2020-2023  润新知