Re: [問題] 一段表達式, 希望版友能幫忙解析...

作者: danny8376 (釣到一隻猴子@_@)   2013-11-01 13:21:17
※ 引述《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
作者: danny8376 (釣到一隻猴子@_@)   2012-01-01 13:25:00
建議搭配原文章LPH66堆文食用 (X搞這樣是效率問題來著XDD 也難怪搞得超複雜www

Links booklink

Contact Us: admin [ a t ] ucptt.com