我正在为一个客户端开发一个html解析器,我刚刚开始搞乱RegEx。我很陌生,但我很快就学会了!在这部分中,我需要获取文档中18.0pt大小的所有文本。这是我尝试过的第一个RegEx(使用实时RegEx测试器):
<p.*?><span.*?style='.*?font-size:1
这是我的测试文字:
<p class=MsoNormal><span style='font-size:14.0pt;font-family:"Comic Sans MS"'>3<sup>rd</sup>
Sunday in Lent - 2013c<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:14.0pt;font-family:"Comic Sans MS"'>Old
Testament – Isaiah 55:1-9<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:14.0pt;font-family:"Comic Sans MS"'>New
Testament – Luke 13:1-9<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:18.0pt;font-family:"Comic Sans MS"'><o:p> </o:p>
</span></p>
它正常工作并分别突出显示每一行,直到1. 问题是,当我将1更改为18时,而不是仅突出显示字体大小的行:18,它突出显示所有方式第一行直到18。我想用18pt字体抓住这一行。谢谢,任何帮助表示赞赏! :)
答案 0 :(得分:2)
这是一个更好的正则表达式:
<p[^>]*>[ \t\r\n]*<span[^>]* style='[^']*font-size:18
你的一个人正如你所说的那样;找到<p
,然后找到任意数量的任意字符,然后是><span
,然后找到更多的任意字符,然后是font-size:18
。因此它会找到第一个<p
,然后找到所有任意字符,直到font-size:18
。在第一个示例中,您很幸运,所有跨度都指定了字体大小。
这个版本不允许这么多;停在任何>
。为了使其更加健壮,我允许<p>
和<span>
之间的空格。
答案 1 :(得分:0)
如果您匹配“除换行符之外的任何字符”,而不是匹配“任何字符”(带点),您将确保不会超出行尾:
<p.*?><span[^\n]*?style='[^\n]*?font-size:18
现在通常.
与换行符不匹配,除非设置了某些标志(这取决于您的环境) - 特别是s
标志。这可能是你的正则表达式测试人员的默认设置吗?
另一个想法是限制您期望与{}匹配的字符数 - 例如
<p.{,20}>
只要您的<p>
代码标记中的字符不超过20个,就会有效。