我想得到两个模式之间的字符串。该模式是<p> </p>
html 文件中的第一个环境。
<p>Sorcery,
R (1)
</p>
<p class="ctext"><b>As an additional cost to cast Goblin Grenade, sacrifice a Goblin.<br><br>Goblin Grenade deals 5 damage to target creature or player.</b></p>
<p><i>Don't underestimate the aerodynamic qualities of the common goblin.</i></p>
<p>Illus. Kev Walker</p>
该环境是文件的第一个,因此我丢弃了直到<p>
之前匹配的所有内容,并且我想删除</p>
.
name="goblin grenade"
wget -O- http://magiccards.info/query?q="$name" | grep -oP '<p>\K[^<]+'
我不知道为什么它不能正常工作。我明白了
Sorcery,
Illus. Kev Walker
答案1
不要使用正则表达式解析 HTML,而是使用适当的 HTML 解析器。
理论 :
根据编译理论,HTML不能使用基于正则表达式的解析有限状态机。由于 HTML 的层次结构,您需要使用下推自动机并操纵左旋受体使用类似工具的语法亚克力。
realLife©®™ 日常工具:
相反,您应该使用正确的工具来完成正确的工作。
...这是一份工作xmllint:
经过字符串匹配:
string="Sorcery"
xmllint --html --xpath "//p[contains(text(), '$string')]/text()" file_or_URL
通过第 N 个<p>
节点,其中 N 为 1:
xmllint --html --xpath "//p[1]/text()" file_or_URL
查看https://stackoverflow.com/questions/1732348/regex-match-open-tags- except-xhtml-self-contained-tags
答案2
免责声明:
@sputnick 的答案显然是正确的方法。 (我喜欢 xmllint,我用它来完成几个 XML/HTML 任务;感谢您教我有关 xpath 选项的知识!!)
然而,其他不太稳健的技术在一次性脚本编写中也很有用......
使用正则表达式获取第一段(在 Perl 中)
perl -n0e 'm!<p.*?>(.*?)</p>!s and print $1'
或者如果你想删除 ' \n
'
perl -n0e 'm!<p.*?>(.*?)</p>!s and print $1 =~ s/\n//gr'