首页 > 解决方案 > Sigil 编辑器:正则表达式字符串在文本中查找(连字符)字符,但不是 html 属性

问题描述

我的问题:我使用Sigil编辑电子书的 xhtml 文件。

从 InDesign 导出到 ePub 时,我勾选选项以删除强制换行符。此操作删除了所有-由 InDesign 自动生成的连字符,但在我的分词微调期间手动添加的字符仍保留在文本中。Sigil 搜索的当前能力:通过-解析所有内容进行搜索,包括 css 类名。

TODO:如何构造正则表达式查询,该查询-在文本中找到,但不在 html 代码中?谢谢!


我已经尝试过的https://www.mobileread.com/forums/showpost.php?p=4099971&postcount=169::

这是一个简单的示例,可以在标签本身之外查找单词“title” ,这是我能想到的最简单的正则表达式搜索。它假定 body 标记中没有裸文本,并且 xhtml 格式正确。

我试过了,它似乎工作。可能有更好更详尽的正则表达式,甚至可以处理损坏的 xhtml。

代码:

title(?=[^>]*<)

这基本上是说搜索“标题”,但在找到下一个开始标签字符“<”之前先确保没有结束标签字符“>”。

可能有一些可以使用反向逻辑的版本。并且有一些方法可以使用正则表达式来查找忽略任何中间标签的两个字符串。

试试看。您可以轻松添加保存的搜索来做到这一点。但同样它不会处理跨越元素(树中的节点)的文本的查找和替换。这是困难的部分,除非您将匹配的子字符串与替换子字符串进行一对一的匹配,而替换子字符串通常不需要这种情况。

当然,如果您在字符串中使用&lt;and&gt;来显示“标签”或代码片段,则会错误地找到这些内容,因此需要在替换之前检查每个查找。

标签: regexxhtmlsigils

解决方案


Sigil中,使用了 PCRE 正则表达式引擎。

因此,您可以使用

<[^<>]*>(*SKIP)(*F)|-

请参阅正则表达式演示

详情

  • <[^<>]*>(*SKIP)(*F)- 匹配除and和 a之外的<零个或多个字符,然后跳过匹配并继续从发生失败的位置开始搜索下一个匹配<>>
  • |- 或者
  • -- 一个连字符。

注意:您可能希望将任何破折号与[\p{Pd}\x{00AD}](替换为-)匹配。


推荐阅读