获取两个模式之间的字符串时出错

获取两个模式之间的字符串时出错

我想得到两个模式之间的字符串。该模式是<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©®™ 日常工具:

相反,您应该使用正确的工具来完成正确的工作。

...这是一份工作:

经过字符串匹配:

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'

相关内容