[問題] 沒有 End tag的字串擷取問題

看板RegExp (正規表示式 Regular Expression)作者 (James)時間9年前 (2015/06/25 17:59), 編輯推噓1(103)
留言4則, 2人參與, 最新討論串1/1
/* 聽說註明使用的語言、環境 * 問題有可能較容易被解決... */ 請教一個問題, 一般在擷取html內容時, 都有明確的起始與結束tag 例如像是 <html>, </html>, <body>, </body>...等 我們可以在正規表示法裡直接指定開始與結束的tag, 例如我們想抓取 <script...> 和 </script> 的內容時, 可以使用下列表示法: (?s)<script\s.*?</script> 就能正確將<script ...> 和 </script> 的內容正確找到. 但假如我手上的資料並沒有明確的結束tag, 如下所示: ===Section1=== line A line B ===Section2=== line C line D ===Section3======= line E line F 能知道的是, 當我們遇到一個 "===Section\d====" 開頭的字串時, 就代表是一個新的section起始位置 想請問的是, 我們有什麼辦法能夠擷取出一個section開頭到 下一個section間的全部內容? 我能想到的是利用 lookahead 的(?!...) 來判斷是否己經遇到 下一個section起始位置, 如果遇到下一個section開頭, 就表示 己經抓到這個section的全部內容, 可以停止比對了 只是目前仍然無法試成功, 底下是我用的方法: 測試: (?s)===Section\d===.*?(?!===Section\d===) => 失敗, 只能比對出每個section的開頭, 無法抓出各個section的內容 測試: (?s)===Section\d===.*(?!===Section\d===) => 失敗: 一口氣比對出全部的內容 測試: ===Section\d===[\w\W]+(?!===Section\d===) => 失敗, 一口氣比對出全部的內容 請教是哪邊有問題呢? 是我使用lookahead的方法有錯嗎? 謝謝 測試環境: Windows 7 + Notepad++ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.171.140.117 ※ 文章網址: https://www.ptt.cc/bbs/RegExp/M.1435226352.A.F47.html

06/25 23:06, , 1F
===Section\d+===[\w\W]+?(?====Section\d+===)
06/25 23:06, 1F

06/25 23:06, , 2F
.不會match換行,lookahead (?!是否定的,要用(?=
06/25 23:06, 2F

06/25 23:07, , 3F
\d+比較好,除非你的數字只有1位數
06/25 23:07, 3F

06/26 00:25, , 4F
原來對於 (?!) 的理解錯誤, 非常感謝指教
06/26 00:25, 4F
文章代碼(AID): #1LYz3mz7 (RegExp)
文章代碼(AID): #1LYz3mz7 (RegExp)