我正在尝试开发一个可以在Sigil ePub 2编辑器中运行的正则表达式。
小型大写是当前ePub读者生态系统中众所周知的问题。许多读者,如Adobe Digital Editions,不支持“font-variant:small-caps”。在尝试了几种不同的解决方法之后,我决定通过将文本转换为大写并将之前的小写字母设置为“font-size:0.75em”来创建假小帽。
这个过程非常繁琐,尤其是在处理有大量尾注和其他书籍引用的书籍时。
假设我在标有“SC”类的HTML页面中有一堆短语。我创建了一个测试短语:
<span class="SC">Hello World! Testing: one tWo thrEE & 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 & W.T.F.</span>
<span class="foo">Don't touch me!</span>
它不漂亮,但它适用于我测试过的每个ePub阅读器。
如果你谷歌“epub small caps regex”,你会看到我编辑的MobileRead wiki文章包含这个正则表达式,我认为这个文章并不令人满意:
(<span class="[a-zA-Z0-9\- ]*?(?<!F)SC[a-zA-Z0-9\-]*?">(?:.+?<span class="FSC">.+?</span>)*[\.|,|:|;|-|–|—|!|\?]? ?(?:&)? ?[A-Z]+)([a-z'’\. ]+)(.*?</span>)
这最终会使一串标点符号小型化,有时会在短语中间停止。我重新开始,认为可能有一个更好的解决方案,不会尝试预先计划每一种可能性。
如果有人想出更好的解决方案,那么你将成为整个ePub出版业的英雄。
我已将Mobile Read wiki的已接受(且唯一)答案添加到了{{3}}。请注意,此正则表达式已经过专门修改,可用于Sigil; YMMV在其他环境中。
答案 0 :(得分:4)
完美的用例:Collapse and Capture a Repeating Pattern in a Single Regex Expression
根据您的情况修改它:
(<span class="SC">(?:(?!<\/span>)(?:[^a-z&]|&[^;]+;))*|(?!^)\G(?:(?!<\/span>)(?:[^a-z&]|&[^;]+;))*)([a-z]+)
替换为:\1<span class="FSC">\U\2\E</span>
以下是RegEx解释:http://regex101.com/r/jU6bA5
这是“全部替换”的解决方案,因为它通过RegEx全局修饰符/g
起作用!