作者cptl (James)
看板RegExp
标题[问题] 字串的撷取问题
时间Thu Jun 25 17:59:09 2015
/*
听说注明使用的语言、环境
*
问题有可能较容易被解决...
*/
请教一个问题, 一般在撷取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://webptt.com/cn.aspx?n=bbs/RegExp/M.1435226352.A.F47.html
1F:推 mars90226: ===Section\d+===[\w\W]+?(?====Section\d+===) 06/25 23:06
2F:→ mars90226: .不会match换行,lookahead (?!是否定的,要用(?= 06/25 23:06
3F:→ mars90226: \d+比较好,除非你的数字只有1位数 06/25 23:07
4F:→ cptl: 原来对於 (?!) 的理解错误, 非常感谢指教 06/26 00:25