(?<=<span ch="w.tag.yjj"><a target="_blank" href=".*?">).*?(?=</a>.*?</span>)匹配<div class="tag" id="questionTag">
  [&nbsp;标签:<span ch="w.tag.yjj"><a target="_blank" href="/z/Search.e?sp=S%E6%9F%94%E8%82%A4%E6%B0%B4">柔肤水</a><span>,</span></span><span ch="w.tag.yjj"><a target="_blank" href="/z/Search.e?sp=S%E7%94%A8%E5%A4%84">用处</a></span>&nbsp;]
 </div>
的时候结果是
柔肤水
<a target="_blank" href="/z/Search.e?sp=S%E7%94%A8%E5%A4%84">用处
而不是柔肤水和用处,如果不用断言,结果正常,用了断言结果就不对了。我换成|写了两个正则表达式分别匹配两个标签,最终结果是><span ch="w.tag.yjj"><a target="_blank" href="/z/Search.e?sp=S%E7%94%A8%E5%A4%84">用处</a></span>&nbsp;]
后面这里只要正则表达式最前边不带>还是和开始的正则表达式结果一样。
谁知道是怎么回事?是不是个BUG?

解决方案 »

  1.   

    (?is)(?<=<a[^>]*?>)[^<>]+(?=</a>)
      

  2.   

    这不是正则的BUG 而是你匹配的问题
    修改成这样就可以了,在你的基本上修改的:(?is)(?<=<span ch="w\.tag\.yjj"><a target="_blank" href=".*?">)[^<>]+(?=</a>.*?</span>)
      

  3.   

    谢谢了。能告诉我我那个不行的原因吗?如果是没有断言的话是开始先匹配到:<span ch="w.tag.yjj"><a target="_blank" href="/z/Search.e?sp=S%E6%9F%94%E8%82%A4%E6%B0%B4">柔肤水</a><span>
    然后再匹配后面的可以匹配到这两个选项。可是加了断言后,从我的结果来看,只有一种可能开始匹配到了“柔肤水”,然后再次匹配的时候是匹配到的<span ch="w.tag.yjj"><a target="_blank" href="/z/Search.e?sp=S%E6%9F%94%E8%82%A4%E6%B0%B4">柔肤水</a><span>,</span></span><span ch="w.tag.yjj"><a target="_blank" href="/z/Search.e?sp=S%E7%94%A8%E5%A4%84">用处</a></span>&这个这一大块,然后去除断言的部分,就是看到的这种结果。
    我以前理解的正则表达式匹配的时候是从前往后,匹配到一个结果后接着用剩下的文本匹配出其余的结果。现在这种结果看是匹配到一个结果之后,去除匹配的结果,而且不包括断言,然后递归一直到匹配不到结果的时候。是这样的吗?