正则表达式匹配HTML标签

最近在用SuperMemo渐进阅读旋元佑的《英语魔法师之语法俱乐部》这本语法书。我的阅读前流程是这样的:(括号内的是所用工具)

  • 将epub电子书按章节分割(calibre-EpubSplit)
  • 将需要阅读的章节导入SuperMemo(Quicker、pandoc、AutoHotkey)
  • 在SuperMemo内将该章节分割成更小的卡片(鼠标右键-阅读-分割-分割文章)
  • 统一将所得的所有卡片设为新材料(根卡片鼠标右键-处理选中分支-学习-忘记)
  • 菜单栏-学习-阶段-新学材料(也可等当天复习完后根据提示进入)

问题在于,我所拥有的这本epub电子书,html标签很乱,导致我在导入SM后无法正确根据html标签分割文章,因此在导入SM前需要先整理epub文件的html标签。这也就是这篇文章的由来。

截取这本书的一个片段:

1
<p class="calibre_16">以上谈的是修饰动词专用的“方法、状态副词”,以及它在句中位置的变化原则。接下来看看其他种类的副词。</p><blockquote class="calibre_5"><blockquote class="calibre2"><blockquote class="calibre2"><blockquote class="calibre2"><blockquote class="calibre_21"><span class="calibre1"><span class="bold"><span class="calibre_12">强调语气的副词(Intensifiers)</span></span></span></blockquote></blockquote></blockquote></blockquote><a id="filepos295095"></a></blockquote><p class="calibre_24">这一类副词有一个特色:它在使用上很有弹性,<span class="bold">四种主要词类,包括名词、动词、形容词与副词都可以用它来修饰。</span>认识这一点,才算真正弄清楚形容词与副词间的分工。这一类的副词又可以细分为以下三种:</p>

所要做的是把下面这一段变为:<h2>强调语气的副词(Intensifiers)</h2>,这样我就可以在SM里很方便地按h2标签分割内容。

1
<blockquote class="calibre2"><blockquote class="calibre2"><blockquote class="calibre2"><blockquote class="calibre_21"><span class="calibre1"><span class="bold"><span class="calibre_12">强调语气的副词(Intensifiers)</span></span></span></blockquote></blockquote></blockquote></blockquote>

可以看到,一共是4个blockquote标签,3个span标签,那么我们可以先设法用正则匹配出一个起始blockquote标签,然后重复4次,匹配出一个起始span标签,然后重复3词,就能匹配出所有的起始标签了。

(<blockquote\s[^>]*">){4}(<span\s[^>]*">){3}

同样的道理,匹配所有的闭合标签。

(<\/span>){3}(</blockquote>){4}

最后,标题可以用(.*?)匹配,把它们组合在一起,就成功匹配出了这段html代码。

(<blockquote\s[^>]*">){4}(<span\s[^>]*">){3}(.*?)(<\/span>){3}(</blockquote>){4}

将其用下面的内容替换,内容就整理好了。

\n<h2>$3</h2>\n

上面的正则,经过我的实践,是比较经济实惠的。以后如果有更好的方案,本文会继续更新。