黑马程序员技术交流社区

标题: 正则表达式如何同时匹配多个字节 [打印本页]

作者: cat73    时间: 2014-9-2 02:09
标题: 正则表达式如何同时匹配多个字节
本帖最后由 cat73 于 2014-9-2 12:40 编辑

        比如我有一段测试文本
  1. <h2><a href="http://bbs.itheima.com">bbs.it<em>hei</em>ma.<em>com</em></a></h2><h2><a >www.it<em>hei</em>ma.<em>com</em></a></h2>
复制代码

        以及一段正则
  1. <h2><a href="([^"]*)">(.*)</a></h2>
复制代码

        这段正则会直接把这整句话视为一个结果,原因就是我的表达式中对a标签里的内容无法完美的匹配,只能使用.*的方式来进行匹配.
        而如果用[^<]*就无法匹配a标签内容中还有标签的情况,总之就是没法完美的匹配这类情况
        于是我就想 如果能有类似这种语法:
  1. [^(</a>)]*
复制代码

        也就是匹配不是"</a>"的部分(将"</a>"视为一个整体),到</a>的时候才停下这部分的匹配,那就可以解决这种问题.
        但是正则实际上没有这种语法,正则一次只能匹配一个字节,不能匹配多个,不知谁有什么解决方案?
        分开多句话写的方式就不要说了,这种方式对我没什么帮助.
        也不要说上面演示的例子没什么意义之类的,这只是为了表达这类问题作出的一个简单的例子,我实际遇到的问题比这个复杂的多,只是这部分实在是想不到解决的方案,而且这类问题我也不是第一次碰到了,因此才来这里求帮助的.
        在此先谢过帮忙的各位啦~~

@各位大神 @各位黑马老师们 求帮助喵~~

==============采纳后追加==============
首先感谢一楼的回复,感觉对正则的了解加深了不少.
不过感觉这种方式虽然可以解决问题,不过还是没匹配到一个整体不包含..........
其次....................... 管理们.......................
采纳最佳答案必须弄个深红色的感叹号么...........
搞的我第一眼以为哪里出错了....................






作者: HKing    时间: 2014-9-2 02:09
本帖最后由 HKing 于 2014-9-2 06:11 编辑

可以用懒惰匹配来写这样的正则表达式:
  1. <h2><a href="([^"]*)">(.*?)</a></h2>
复制代码
懒惰匹配:匹配尽可能少的字符。
    如表达式:a.*b,它将会匹配以a开始,以b结束的最长字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab,这被称为:贪婪匹配。
    但是用表达式 a.*?b,它会匹配以a开始,以b结束的最短字符串。如果用它来搜索aabab的话,它会匹配整个字符串aab和ab。这被称为:懒惰匹配。

懒惰限定符
*?             重复任意次,但尽可能少重复
+?            重复1次或更多次,但尽可能少重复
??            重复0次或1次,但尽可能少重复
{n,m}?     重复n到m次,但尽可能少重复
{n,}?        重复n次以上,但尽可能少重复

举例1
       表达式 <td>(.*)</td 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配时,匹配的结果成功,匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串, 表达式中的 "</td>" 将与字符串中最后一个 "</td>" 匹配。
举例2
       相比之下,表达式 "<td>(.*?)</td>" 匹配举例1中同样的字符串时,将只得到 "<td><p>aa</p></td>", 再次匹配下一个时,可以得到第二个 "<td><p>bb</p></td>"。

       我能想到的办法就这个了,希望能帮到你!



作者: justin1258    时间: 2014-9-2 09:23
一楼的正解。。
作者: 毛毛毛玉    时间: 2014-9-23 11:07
是说零宽断言吗?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2