# 请教一个正则式的问题

**URL:** <https://forum.freemdict.com/t/topic/16611>\
**Category:** 技术交流与词典编修\
**Tags:** 正则表达式, 技术, 求助\
**Created:** [2022 年10 月 28 日 09:22 UTC](https://forum.freemdict.com/t/topic/16611 "2022-10-28T09:22:36Z")\
**Posts on this page:** 16\
**Page:** 1

<div class="post-metadata">

作者： ![skippy](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/skippy/32/8444_2.png) [@skippy](https://forum.freemdict.com/u/skippy)\
发布日期： [2022 年10 月 28 日 09:22 UTC](https://forum.freemdict.com/t/topic/16611/1 "2022-10-28T09:22:36Z")

</div>

几年前把一个来源不明且受污染的汉语大词典转为stardict格式，放在Kobo 的Koreader里面使用。由于使用时间不短，曾经遇到不少繁简转换错误，随手查对其他本子修改了。当然还有许多问题存在，但由于花了不少时间，不忍弃置。有个格式问题倒是很碍眼，就是在不该换行时换行了。例如：

楊樹達《積微居讀書記‧莊子拾遺‧天道第十三》：“‘區’當讀為‘句。’\n 《禮記‧月令》云：‘季春之月，句者畢出，萌者盡達。’《莊》云‘萌區’，即《月令》所云‘萌者句者’也。‘句’‘區’音近相通。” 參見 “區萌” 。

要把“和” 之间的\n 都删除，在正则式里怎么做？谢谢！

---

<div class="post-metadata">

作者： ![AnLuoRidge](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/anluoridge/32/35936_2.png) [@AnLuoRidge](https://forum.freemdict.com/u/AnLuoRidge)\
发布日期： [2022 年10 月 28 日 09:36 UTC](https://forum.freemdict.com/t/topic/16611/2 "2022-10-28T09:36:08Z")

</div>

没有看懂，请贴更完整的有问题的词典内容，应包含大量上下文。

此问题的难点在于怎么保留需要的换行，你要把限制条件想得很清楚才行。

---

<div class="post-metadata">

作者： ![skippy](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/skippy/32/8444_2.png) [@skippy](https://forum.freemdict.com/u/skippy)\
发布日期： [2022 年10 月 28 日 09:44 UTC](https://forum.freemdict.com/t/topic/16611/3 "2022-10-28T09:44:34Z")

</div>

：“‘區…相通。” 之间的两个双引号内，都是楊樹達书的引文，不应该在《禮記‧月令》前换行，所以想把这换行指令删除。

---

<div class="post-metadata">

作者： ![AnLuoRidge](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/anluoridge/32/35936_2.png) [@AnLuoRidge](https://forum.freemdict.com/u/AnLuoRidge)\
发布日期： [2022 年10 月 28 日 10:04 UTC](https://forum.freemdict.com/t/topic/16611/4 "2022-10-28T10:04:03Z")

</div>

哦，原来是引号，我以为你把「和」给引了起来。。。

 ![image](https://forumcdn.freemdict.com/uploads/default/original/3X/b/d/bd4281652690e7697653c3d7ddb7426393ef922a.png)

---

<div class="post-metadata">

作者： ![skippy](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/skippy/32/8444_2.png) [@skippy](https://forum.freemdict.com/u/skippy)\
发布日期： [2022 年10 月 28 日 10:30 UTC](https://forum.freemdict.com/t/topic/16611/5 "2022-10-28T10:30:56Z")

</div>

感谢！我好好学习。

---

<div class="post-metadata">

作者： ![surfactant](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/s/dbc845/32.png) [@surfactant](https://forum.freemdict.com/u/surfactant)\
发布日期： [2022 年10 月 28 日 12:54 UTC](https://forum.freemdict.com/t/topic/16611/6 "2022-10-28T12:54:46Z")

</div>

我刚才在VS里面只搜到一个能用的Regex Editor插件，整半天居然没找到 input string 开启自动换行的方法。请教下你这分析正则式用的是什么工具？VS Code里的插件？

---

<div class="post-metadata">

作者： ![AnLuoRidge](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/anluoridge/32/35936_2.png) [@AnLuoRidge](https://forum.freemdict.com/u/AnLuoRidge)\
发布日期： [2022 年10 月 28 日 13:06 UTC](https://forum.freemdict.com/t/topic/16611/7 "2022-10-28T13:06:54Z")

</div>

1. 不太确定你想问的是啥，反正在 VS Code 里开启自动换行可通过：View → Word Wrap
2. 正则分析工具非常多，我这个是 [https://regex101.com/](https://regex101.com/), 还有能可视化的 [https://jex.im](https://jex.im)。  
另外还有一派希望能替代正则的，比如[用函数式编程把正则变得更可读](https://softwareengineering.stackexchange.com/a/333551)（英文）、[Regular expressions made readable in Java](https://github.com/ricoapon/readable-regex)。

---

<div class="post-metadata">

作者： ![surfactant](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/s/dbc845/32.png) [@surfactant](https://forum.freemdict.com/u/surfactant)\
发布日期： [2022 年10 月 28 日 13:11 UTC](https://forum.freemdict.com/t/topic/16611/8 "2022-10-28T13:11:42Z")

</div>

你用的是网页啊，我还以为是IDE里自带的分析工具呢。

我在VS中搜到一个唯一个还能用的插件，有点奇葩。IDE里写代码换行开关我知道，这个换行是指插件窗口里的换行。这个插件基本没法用。回头我试试你上面说的几个。以前都是人工算capture group，有点痛苦 😀

---

<div class="post-metadata">

作者： ![AnLuoRidge](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/anluoridge/32/35936_2.png) [@AnLuoRidge](https://forum.freemdict.com/u/AnLuoRidge)\
发布日期： [2022 年10 月 28 日 13:25 UTC](https://forum.freemdict.com/t/topic/16611/10 "2022-10-28T13:25:56Z")

</div>

哦，那 regex101 比那个插件强多了，实时匹配测试，实时分析。

btw 我很多时候，有些简单的临时替换，会直接在浏览器控制台里写。

---

<div class="post-metadata">

作者： ![surfactant](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/s/dbc845/32.png) [@surfactant](https://forum.freemdict.com/u/surfactant)\
发布日期： [2022 年10 月 28 日 13:29 UTC](https://forum.freemdict.com/t/topic/16611/11 "2022-10-28T13:29:50Z")

</div>

浏览器还能派这个用场，有点意思，又学一招

---

<div class="post-metadata">

作者： ![Mastameta](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/mastameta/32/8240_2.png) [@Mastameta](https://forum.freemdict.com/u/Mastameta)\
发布日期： [2022 年10 月 28 日 15:10 UTC](https://forum.freemdict.com/t/topic/16611/12 "2022-10-28T15:10:39Z")

</div>

可以考慮把所有例證、釋義中的 `\n` 都刪掉，重新認定例證。例如在 EmEditor:

1. 先標上例證必有的結尾：  
FIND：`([。？！][’]*”)`  
REPLACE：`\1◨`

2. 再標上例證之中必有的標點：  
FIND：`(》：“)` 或 ` (：“)` 看狀況處理。  
REPLACE：\1⬤

3. 把例證夾在標籤。第二括號指例證：  
FIND：`(。|◨|</🗹>|<p>)([^。⬤◨🗹]+⬤[^⬤◨🗹]+)◨`  
REPLACE：`\1<🗹>\2</🗹>`

第一個括號裡的 `|` 是 `or` 的意思：`A or B or C or D` 等等。按照自己數據調理：指定例證開頭的候選位子。  
比方說：例證可以從釋義句子的逗號`（。）`開始。自然也可以從前面例證的結尾`（◨|</🗹>）` 開始。或從 `（<p>）`標籤開始。這正則邊調邊用。字典格式不一。

弄完，把 `[⬤◨]` 刪掉。  
然後把 `<🗹>`、`</🗹>` 換成你要的標籤名。

這做法的前提是 `“` 與 `”` 的引號數量是對稱的。用 FIND 來分別計算。不數也罷了，不用那麼龜毛、事兒媽哈哈。

---

<div class="post-metadata">

作者： ![endnote](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/e/9de0a6/32.png) [@endnote](https://forum.freemdict.com/u/endnote)\
发布日期： [2022 年10 月 28 日 16:22 UTC](https://forum.freemdict.com/t/topic/16611/13 "2022-10-28T16:22:17Z")

</div>

> [@Mastameta](#):
>
> 前提是 `“` 與 `”` 的引號數量是對稱的

Sadly anomalies always exits, esp. in a large text file.

---

<div class="post-metadata">

作者： ![Mastameta](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/mastameta/32/8240_2.png) [@Mastameta](https://forum.freemdict.com/u/Mastameta)\
发布日期： [2022 年10 月 29 日 03:20 UTC](https://forum.freemdict.com/t/topic/16611/15 "2022-10-29T03:20:48Z")

</div>

> [@endnote](#):
>
> Sadly anomalies always exist, esp. in a large text file.

嗯，標點經常有問題，我沒見過引號完全對稱的數據。  
而且漢字字典的標點要先標準化，零碎的半寬 `.?! ` 改成全寬 `。？！`

---

<div class="post-metadata">

作者： ![surfactant](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/s/dbc845/32.png) [@surfactant](https://forum.freemdict.com/u/surfactant)\
发布日期： [2022 年10 月 29 日 03:35 UTC](https://forum.freemdict.com/t/topic/16611/16 "2022-10-29T03:35:03Z")

</div>

这个解决不难，各人根据自己的常用资料的特点写一个批量正则替换的脚本进行标准化处理一下就行，象你做的那个正则就是经过长期改进得到的吧。

---

<div class="post-metadata">

作者： ![Mastameta](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/mastameta/32/8240_2.png) [@Mastameta](https://forum.freemdict.com/u/Mastameta)\
发布日期： [2022 年10 月 29 日 03:56 UTC](https://forum.freemdict.com/t/topic/16611/17 "2022-10-29T03:56:38Z")

</div>

嗯，不難，按照自己數據調理。弄一弄，做到可以用的程度。  
要達到近 100% 的準確度，會發現紙本本身也有問題，標點有錯失、例證的格式不規範，難免要手工處理些。常見的是 `《書名》：“引文”。`這逗號錯位。  
釋義 `如：“AB”、“AC。”` 也是錯位。這是搭配詞例，不是例證。  
如果 0.5% 有問題，說多也不多，講絕對數也不少。古代汉语词典2，例證我沒整理，翻翻應當有問題。

---

<div class="post-metadata">

作者： ![surfactant](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/s/dbc845/32.png) [@surfactant](https://forum.freemdict.com/u/surfactant)\
发布日期： [2022 年10 月 29 日 04:01 UTC](https://forum.freemdict.com/t/topic/16611/18 "2022-10-29T04:01:28Z")

</div>

我以前处理OCR文本多的时候，就攒过一个极长的脚本，使用时间越长就越完善。处理不了的可疑之处，自动标记出来再人工处理，基本可以达到满意
