3

我正在尝试开发一个可以在ePub 2 编辑器Sigil中运行的正则表达式。

小型股是当前 ePub 阅读器生态系统中的一个众所周知的问题。许多阅读器,例如 Adob​​e Digital Editions,不支持“font-variant: small-caps”。在尝试了几种不同的解决方法后,我决定通过将文本转换为大写并将以前的小写字母设置为“font-size: 0.75em”来创建假的小型大写字母。

这个过程非常繁琐,尤其是在处理有很多尾注并引用其他书籍的书籍时。

假设我在一个带有“SC”类标签的 HTML 页面中有一堆短语。我创建了一个测试短语:

<span class="SC">Hello World! Testing: one tWo thrEE &amp; W.T.F.</span>
<span class="foo">Don't touch me!</span>

目标是编写一个仅匹配“SC”跨度标记内的任何小写字母的正则表达式,并将它们替换为:

<span class="FSC">LETTERS</span>

我可以设法匹配和替换第一个单词“Hello”中的字母,但在那之后一切都崩溃了。

这是我到目前为止所得到的:

寻找:

(<span class="SC">.*?)([a-z]+)(.*</span>)

代替:

\1<span class="FSC">\U\2\E</span>\3

棘手的部分是继续在该标签中找到其余的小写字母,现在引入了新的“FSC”(假小写字母)跨度标签。再次尝试相同的正则表达式会导致“span”,然后“class”得到FSC处理。理想情况下,我希望能够一直点击“全部替换”按钮,直到找不到更多匹配项。

完成后,上面的示例将如下所示:

<span class="SC">H<span class="FSC">ELLO</span> W<span class="FSC">ORLD</span>! T<span class="FSC">ESTING</span>: <span class="FSC">ONE</span> <span class="FSC">T</span>W<span class="FSC">O</span> <span class="FSC">THR</span>EE &amp; W.T.F.</span>
<span class="foo">Don't touch me!</span>

它并不漂亮,但它适用于我测试过的每个 ePub 阅读器。

如果您在 Google 上搜索“epub small caps regex”,您会看到我编辑的 MobileRead wiki 文章以包含此正则表达式,但我认为该文章并不令人满意:

(<span class="[a-zA-Z0-9\- ]*?(?<!F)SC[a-zA-Z0-9\-]*?">(?:.+?<span class="FSC">.+?</span>)*[\.|,|:|;|-|–|—|!|\?]? ?(?:&amp;)? ?[A-Z]+)([a-z'’\. ]+)(.*?</span>)

这最终会缩小一堆标点符号,有时会停在一个短语的中间。我重新开始,认为可能有一个更好的解决方案,它不会尝试预先计划每一种可能性。

如果有人对此提出更好的解决方案,您将成为整个 ePub 出版业的英雄。

更新

我已将接受的(也是唯一的)答案添加到Mobile Read wiki。请注意,此正则表达式已专门为在 Sigil 中使用而进行了更改;YMMV 在其他环境中。

4

1 回答 1

4

完美用例:在单个正则表达式中折叠和捕获重复模式

针对您的情况对其进行了修改:

(<span class="SC">(?:(?!<\/span>)(?:[^a-z&]|&[^;]+;))*|(?!^)\G(?:(?!<\/span>)(?:[^a-z&]|&[^;]+;))*)([a-z]+)

用。。。来代替:\1<span class="FSC">\U\2\E</span>

这是正则表达式的解释:http ://regex101.com/r/jU6bA5

这是“全部替换”的解决方案,因为它通过 RegEx 全局修饰符工作/g

于 2013-04-11T20:11:55.130 回答