黑马程序员技术交流社区
标题:
正则表达式如何同时匹配多个字节
[打印本页]
作者:
cat73
时间:
2014-9-2 02:09
标题:
正则表达式如何同时匹配多个字节
本帖最后由 cat73 于 2014-9-2 12:40 编辑
比如我有一段测试文本
<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>
复制代码
以及一段正则
<h2><a href="([^"]*)">(.*)</a></h2>
复制代码
这段正则会直接把这整句话视为一个结果,原因就是我的表达式中对a标签里的内容无法完美的匹配,只能使用.*的方式来进行匹配.
而如果用[^<]*就无法匹配a标签内容中还有标签的情况,总之就是没法完美的匹配这类情况
于是我就想 如果能有类似这种语法:
[^(</a>)]*
复制代码
也就是匹配不是"</a>"的部分(将"</a>"视为一个整体),到</a>的时候才停下这部分的匹配,那就可以解决这种问题.
但是正则实际上没有这种语法,正则一次只能匹配一个字节,不能匹配多个,不知谁有什么解决方案?
分开多句话写的方式就不要说了,这种方式对我没什么帮助.
也不要说上面演示的例子没什么意义之类的,这只是为了表达这类问题作出的一个简单的例子,我实际遇到的问题比这个复杂的多,只是这部分实在是想不到解决的方案,而且这类问题我也不是第一次碰到了,因此才来这里求帮助的.
在此先谢过帮忙的各位啦~~
@各位大神 @各位黑马老师们 求帮助喵~~
==============采纳后追加==============
首先感谢一楼的回复,感觉对正则的了解加深了不少.
不过感觉这种方式虽然可以解决问题,不过还是没匹配到一个整体不包含..........
其次....................... 管理们.......................
采纳最佳答案必须弄个深红色的感叹号么...........
搞的我第一眼以为哪里出错了....................
qwewqeq.jpg
(19.81 KB, 下载次数: 104)
下载附件
2014-9-2 12:37 上传
作者:
HKing
时间:
2014-9-2 02:09
本帖最后由 HKing 于 2014-9-2 06:11 编辑
可以用
懒惰匹配
来写这样的正则表达式:
<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