作者danny8376 (钓到一只猴子@_@)
标题Re: [问题] 一段表达式, 希望版友能帮忙解析...
时间Fri Nov 1 13:21:17 2013
※ 引述《DongFeng (Little Five)》之铭言:
: 表达式:/<table[^>]*+>([^<]*+(?:(?!<\/?+table)<[^<]*+)*+)<\/table>/i
好长好长好乱的表达式www
: 这段表达式在实际使用上是抓出来源字串内的所有<table>...</table>
: 我知道[^>]表达的是 不包含> 的所有字串, 但一直弄不清楚的是在[^>]後面的*+的作用
: 第一个问题:*是匹配<table[^>]还是匹配[^>], 如果是匹配[^>]是不是表示允许拥有零个
: 或多个 不包含> 的字串, 因为我一直在想既然是要抓出tabel, 匹配<table[^>]表示允许
: 零个又很怪
[^>]*+ 只有()Group起来才会一起算 不然取量符只算前一个(Group就是整坨当一个啦)
: 第二个问题:为什麽要在*号後面再加上+, *不是就允许零个或多个字串存在了吗?为什麽
: 还要多一个允许一个或多个字串存在的+呢?
这在不少语言的RegExp里面都不支援XD
以原文推文中的Perl的官方文件里面的举例
'aaaa' =~ /a++a/
这并不会被匹配
简单来说++就是比greedy还更greedy
连最後那个a++
a的a都被a++给吃掉了
也就是不管後方能不能匹配 总之完全不让步的吃乾净
以这边来说应该*和*+没差异 因为後方是匹配 > 但前面的[^>]就拒绝匹配了
所以<table
这边应该都会被吃乾净才对>
: 第三个问题:中间()的部分已经完全不能理解.,正常table里头会允许<thead>...</thead>
: <tr>...</tr>,<td>...</td>,<tfoot>...</tfoor>等tag的存在, 但是()中开始就用[^<]
: 拒绝 < 的存在, 希望有版友能替我解释这一段...
这边你看眼花了吧XDD
把首尾的<table></table>拆掉整理下
([^<]*+ (?:(?!<\/?+table) <[^<]*+) *+)
别忘了<table>
这里常有空白<tr>
所以先用[^<]*+来匹配非tag开头的字元 遇到tag开头是後面要处理的
後面则是拒绝匹配任何<table或</table接着的部分
(对前方的[^<]*+或後续匹配的这个non-capture group而言)
再後面才开始尝试匹配<及其後所有非<文字
(这non-capture group後方跟者*+ 所以整段是匹配所有非<table或</table的<XXX)
上这超乱的东西就是为了避免误吃</table以及不合法的<table
会写成这样主要是用了*+这种吃光光的写法 所以匹配时要手动排除掉
: 抱歉, google跟在版上爬文了还是花煞煞, 不得已只好直接发文问了, 还请大家不吝啬指
: 教
个人理解大致是如此XD
如果有错还请麻烦鞭一下www
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.115.216.102
1F:→ danny8376:建议搭配原文章LPH66堆文食用 (X 11/01 13:25
2F:→ danny8376:搞这样是效率问题来着XDD 也难怪搞得超复杂www 11/01 13:26