式一:http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?内容:<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">选出内容:http://www.w3.org/1999/xhtml
——————————————————————————————————————————式二:(?<=<title\s*[^>]*>).*(?=<\/title>)内容: <title>World Wide Web Consortium - Web Standards</title>选出内容:World Wide Web Consortium - Web Standards
——————————————————————————————————————————对正则表达不是很了解,上午发个帖子问了网页采集的问题,然后有朋友给了例子,就是没看懂这几个正则表达式。求高手详细分析下这两个式子,以及为什么选出这样的结果。

解决方案 »

  1.   

    式一:http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 如果是用来提取,这个表达式并不好
    (s)? 这里的()用得完全没有道理,画蛇添足,降低匹配效率,直接https?//就是了
    ([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 这个没什么好解释的,用来验证规则还好,用来提取就是本末倒置了,只会降低匹配效率
    式二:(?<=<title\s*[^>]*>).*(?=<\/title>) 这个式子多少还说得过去,只是其中的“.*”用得不太合适
    (?<=<title\s*[^>]*>) 逆序环视,表示所在位置的左侧是<title...>标签,可以认为是一个附加条件,匹配的内容并不计入匹配结果
    (?=<\/title>) 顺序环视,表示所在位置右侧是</title>,如果是用在.NET程序中,“/”不需要转义,如果是用在javascript中,一般情况下需要转义
    .* 属于贪婪模式,在匹配成功的前提下,会尽可能多的匹配,这也就追成了先是过多的匹配,然后再进行多次回溯以达到整个表达式匹配成功的目的,会降低匹配效率,可以优化为
    (?<=<title\s*[^>]*>)(?:(?!</title>).)*(?=</title>) 
    根据应用环境,如果是.NET中,可以进一步优化为
    (?<=<title\s*[^>]*>)(?>(?:(?!</title>).)*)(?=</title>)
      

  2.   


    我在整理,不过由于最近工作忙,什么时候整理出来就不一定了,在这之前,推荐你看这篇文章
    http://www.regexlab.com/zh/regref.htm