我想从html中提取数据。问题是,我无法提取位于顶部和底部的2个字符串。
我想提取23423423423
和1234523453245
,但只有,如果之间有字符Allan
:
<h4><a href="/Profile/23423423423.html">@@@@@@</a> </h4> said12:49:32
</div>
<a href="javascript:void(0)" onclick="replyAnswer(@@@@@@@@@@,'GET','');" class="reportLink">
report </a>
</div>
<div class="details">
<p class="content">
Hi there, Allan.
</p>
<div id="AddAnswer1234523453245"></div>
当然,我可以这样做:Profile\/(\d+).*\s*.*\s*.*\s*.*\s*.*\s*.*\s*.*\s*.*Allan.*\s*.*\s*.*AddAnswer(\d+)
。但代码太可怕了。有没有解决方案让它更短?
我在考虑:
Profile\/(\d+)(.\sAllan)*AddAnswer(\d+)
或
Profile\/(\d+)(.*Allan\s*)*AddAnswer(\d+)
但wchich都没有正常工作。你有什么想法吗?
答案 0 :(得分:2)
您可以使用[\S\s]
构建一个字符组,以匹配任何字符,包括换行符。所有空格和非空格字符都是字符。
然后,你的尝试相当接近
/Profile\/(\d+)[\S\s]*Allan[\S\s]*AddAnswer(\d+)/
这将查找配置文件,其后面的数字,Allan之前的任何字符,AddAnswer之前的任何字符以及之后的数字。如果您有单行模式(/s
),那么您可以改为使用点。
/Profile\/(\d+).*Allan.*AddAnswer(\d+)/s
答案 1 :(得分:0)
您可以使用m
指定.
来匹配换行符。
/Profile\/(\d+).+AddAnswer(\d+)/m
答案 2 :(得分:0)
Better use a parser instead。如果您出于某种原因必须使用正则表达式,那么您可能会使用tempered greedy solution:
Profile/(\d+) # Profile followed by digits
(?:(?!Allan)[\S\s])+ # any character except when there's Allan ahead
Allan # Allan literally
(?:(?!AddAnswer)[\S\s])+ # same construct as above
AddAnswer(\d+) # AddAnswer, followed by digits