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

作者: cptl (James)   2015-06-25 17:59:09
/* 聽說註明使用的語言、環境
* 問題有可能較容易被解決...
*/
請教一個問題, 一般在擷取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++
作者: mars90226 (火星人)   2015-06-25 23:06:00
===Section\d+===[\w\W]+?(?====Section\d+===).不會match換行,lookahead (?!是否定的,要用(?=\d+比較好,除非你的數字只有1位數
作者: cptl (James)   2015-06-26 00:25:00
原來對於 (?!) 的理解錯誤, 非常感謝指教

Links booklink

Contact Us: admin [ a t ] ucptt.com