# 【求助】请教一个关于正则匹配的问题

**URL:** <https://forum.freemdict.com/t/topic/15119>\
**Category:** 技术交流与词典编修\
**Created:** [2022 年9 月 5 日 08:28 UTC](https://forum.freemdict.com/t/topic/15119 "2022-09-05T08:28:05Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

作者： ![唐棣之華](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/%E5%94%90/e68b1a/32.png) [@唐棣之華](https://forum.freemdict.com/u/%E5%94%90%E6%A3%A3%E4%B9%8B%E8%8F%AF)\
发布日期： [2022 年9 月 5 日 08:28 UTC](https://forum.freemdict.com/t/topic/15119/1 "2022-09-05T08:28:05Z")

</div>

小伙伴们好！我想请教一下关于正则表达式匹配的问题，希望有伙伴能帮助解决。具体问题见下：

 ![图片](https://forumcdn.freemdict.com/uploads/default/original/3X/8/a/8adba1592ffb92dac2e6e1d65f1dc4e92eabce9b.jpeg)

文本数据见下：

```auto
<z><i>書?盤庚上</i>：“各恭爾事，齊乃位，度乃口。”</z>
<z><u>孫星衍</u>疏：“度，<i>説文</i>作‘??’，云：‘閉也。’此省文。”</z>
<z><i>墨子?小取</i>：“度其所惡。”</z><z><u>刘师培</u>注：“度與??同，閉也。??其所惡，謂塞其所惡也。”</z>

```

我想要提取的是在引号“之后出现书名标签\< i\>（不一定紧接着，引号和书名标签之间可以有其它字符）的\< z\>标签一行，即提取结果是文本数据第二段「孙星衍疏…」。

所以正则表达式该如何写呢？

感谢你们的帮助和解答😺

---

<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 年9 月 5 日 08:43 UTC](https://forum.freemdict.com/t/topic/15119/2 "2022-09-05T08:43:56Z")

</div>

如果设定引号“之后与标签`<i>`中间隔着0到10个字符，可写成  
`^<z>.*：“.{0,10}?<i>.*</z>$`  
^表示行首，$表示行尾

不知道对不对，可试试看。  
找出不符合要求的或者漏掉的行后，再改进表达式

---

<div class="post-metadata">

作者： ![唐棣之華](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/%E5%94%90/e68b1a/32.png) [@唐棣之華](https://forum.freemdict.com/u/%E5%94%90%E6%A3%A3%E4%B9%8B%E8%8F%AF)\
发布日期： [2022 年9 月 5 日 08:55 UTC](https://forum.freemdict.com/t/topic/15119/3 "2022-09-05T08:55:16Z")

</div>

谢谢解疑。可能我上面解释不够清楚。其实文本数据中\< z\>标签是不换行的，是合并一起的。如果我只是想匹配符合上述特征的\< z\>标签之间的内容呢。也就是对每个\< z\>标签文本进行检索，看其是否符合上述的特征，符合就匹配提取该\< z\>标签的内容。这又该怎么写呢

---

<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 年9 月 5 日 08:57 UTC](https://forum.freemdict.com/t/topic/15119/4 "2022-09-05T08:57:20Z")

</div>

那就试试  
`<z>.*：“.{0,10}?<i>.*?</z>`  
多了第二个？，建议兄台了解一下正则中贪婪模式的定义

不过这种写法有bug。最好是先处理一下，把每对`<z></z>`放在单独一行，可以避免bug

---

<div class="post-metadata">

作者： ![唐棣之華](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/%E5%94%90/e68b1a/32.png) [@唐棣之華](https://forum.freemdict.com/u/%E5%94%90%E6%A3%A3%E4%B9%8B%E8%8F%AF)\
发布日期： [2022 年9 月 5 日 09:08 UTC](https://forum.freemdict.com/t/topic/15119/5 "2022-09-05T09:08:07Z")

</div>

哈哈好的，我了解了一点点，正在边解决边学。您这个正则我试了下，特征描写是正确的，不过就是会把所有的\< z\>标签都含括在内，所以匹配的结果也不是很准确。如何才能精准提取符合这一特征的每一个\< z\>标签的内容呢，真头大🤣

分行好像能解决，但是这字典数据太庞大不太好为每个\< z\>分行🤣

---

<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 年9 月 5 日 09:11 UTC](https://forum.freemdict.com/t/topic/15119/6 "2022-09-05T09:11:39Z")

</div>

> [@endnote](#):
>
> 把每对`<z></z>`放在单独一行，可以避免bug

是不会这个吗？`<z>`替换为`\n<z>`；`</z>`替换为`</z>\n`  
bug是因为上面那个表达式的第一个`.*`自由度太大，所以需要放在单独一行

慢慢试试看吧，熟能生巧。  
我的正则水平也不高，看看其他高手有啥好办法

---

<div class="post-metadata">

作者： ![唐棣之華](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/%E5%94%90/e68b1a/32.png) [@唐棣之華](https://forum.freemdict.com/u/%E5%94%90%E6%A3%A3%E4%B9%8B%E8%8F%AF)\
发布日期： [2022 年9 月 5 日 09:16 UTC](https://forum.freemdict.com/t/topic/15119/7 "2022-09-05T09:16:16Z")

</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 年9 月 5 日 09:51 UTC](https://forum.freemdict.com/t/topic/15119/9 "2022-09-05T09:51:29Z")

</div>

```auto
<z>((?!<\/z>).|\n|\r)*“((?!”).|\n|\r)*<i>((?!<\/z>).|\n|\r)*<\/z>

```

\<\>[Regex Tutorial - Lookahead and Lookbehind Zero-Length Assertions](https://www.regular-expressions.info/lookaround.html)\<\>

---

<div class="post-metadata">

作者： ![唐棣之華](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/%E5%94%90/e68b1a/32.png) [@唐棣之華](https://forum.freemdict.com/u/%E5%94%90%E6%A3%A3%E4%B9%8B%E8%8F%AF)\
发布日期： [2022 年9 月 5 日 11:40 UTC](https://forum.freemdict.com/t/topic/15119/10 "2022-09-05T11:40:45Z")

</div>

感谢！很完美👍也感谢提供学习网站，速学了一会，明白了不少 😄
