博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[\s\S]*?懒惰模式特殊情形
阅读量:6341 次
发布时间:2019-06-22

本文共 858 字,大约阅读时间需要 2 分钟。

通常理解[\s\S]*?X (X代表任意指定字符) 表示匹配任何字符的懒惰模式,一旦遇到后面出现的X便停止匹配,但实际不是如此,会尽可能的把后面的内容也匹配进去。如:

表达式 <tr[\s\S]*?>\s*<td>[\s\S]*?</td>\s*<td>[\s\S]*?</td>\s*</tr> 本来想匹配如下<tr></tr>之间的内容,

<tr style="text">

<td>FID</td>

<td>0</td>

</tr>

却也能匹配

<tr style="text-align:center;font-weight:bold;background:#9CBCE2">

<td> </td>

</tr>

<tr>

<td>

<table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-spacing:0px; padding:3px 3px 3px 3px">

<tr>

<td>FID</td>

<td>0</td>

</tr>

原因就在于虽然是懒惰模式,但[\s\S]*?</td>并未匹配到第一个</td>就结束,可能的原因是,系统发现如果在第一个</td>处就结束,前面的内容就不满足搜索条件,于是将[\s\S]*?继续往后匹配,直到FID</td>,使后面的内容尽量多得匹配表达式。

这可能是正则表达式[\s\S]*?的一个机制,最大可能的匹配尽量多的内容,以符合整个表达式的条件。并不局限于遇到后续第一个指定字符就停止。

解决方法:不需要[\s\S]*匹配换行时,用.代替[\s\S]或[\w\W]*等。如上述表达式写为

<tr.*?>\s*<td>.*?</td>\s*<td>.*?</td>\s*</tr>

就能准确匹配到<tr></tr>间的内容

 

转载于:https://www.cnblogs.com/mol1995/p/10997400.html

你可能感兴趣的文章
jdbc 简单连接
查看>>
多态初步认识
查看>>
数组处理:118
查看>>
为什么要优先使用组合而不是继承 .
查看>>
【MySql】权限不足导致的无法连接到数据库以及权限的授予和撤销
查看>>
android实现gif图与文字混排
查看>>
安卓新标准出台_告别乱弹窗_你的手机真会省电么?
查看>>
hdu1384Intervals(差分约束)
查看>>
python 字符编码
查看>>
269D Maximum Waterfall
查看>>
C++11 多线程
查看>>
统一项目管理平台(UMPlatForm.NET)-第3章 软件安装、配置、运行方法
查看>>
计算机网路知识的简单介绍
查看>>
sed-加速你在Linux的文件编辑
查看>>
HttpServer发送数据到kafka
查看>>
phpcms站---去除域名绑定目录中的HTML
查看>>
2017-5-3 打印控件、MDI 窗体容器
查看>>
20155303 2016-2017-2 《Java程序设计》第九周学习总结
查看>>
一次很失败的抄底
查看>>
数据结构C++(10)二叉树——链表实现(linkBinaryTree)
查看>>