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

看板RegExp (正規表示式 Regular Expression)作者 (釣到一隻猴子@_@)時間11年前 (2013/11/01 13:21), 編輯推噓0(002)
留言2則, 1人參與, 最新討論串2/4 (看更多)
※ 引述《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

11/01 13:25, , 1F
建議搭配原文章LPH66堆文食用 (X
11/01 13:25, 1F

11/01 13:26, , 2F
搞這樣是效率問題來著XDD 也難怪搞得超複雜www
11/01 13:26, 2F
文章代碼(AID): #1ISpfFWU (RegExp)
文章代碼(AID): #1ISpfFWU (RegExp)