请教大家一个复杂的正则表达式的问题,即如何匹配 Markdown 文件中嵌套的 HTML 表格中的 Markdown 语法的链接和加粗内容。

2020-02-03 01:58:57 +08:00
 myscarh
目标 Markdown 文件是类似这样的:

<td sda> sdfsdf
//不能被匹配的单元格
wee</td>
<td sdff>sdfsdfsdf
** 需要被匹配的粗体**
sd[需要被匹配的链接]( http)sdfsd
两边有空格
<p>其他 HTML 标签 <br/>abc</p>
</td>
</table>
## Markdown 语法的部分
[不能被匹配的链接]( http)
**不能被匹配的粗体**
<table>
<th>aa</th
<td> sdfsdf 不能被匹配的单元格 sdfsdf
wee</td>
<td> sdfsdf 不能被匹配的单元格 sdfsdf

wee</td>
<td> ** 需要被匹配的粗体**
sd[需要被匹配的链接]( http)sdfsdsdfsdf
<p> 其他 HTML 标签 <br/>abc </p>
</td>
<td sdff>sdfsdfsdf

//不能被匹配的单元格
<b>asdasd</b>
</td>


要求是不能匹配没有 Markdown 加粗或链接的 HTML 单元格,而且返回结果除了<td, </td>, [, ], (和)以外必须被分组捕捉以用于批量替换。
可以一次只匹配一个单元格中的一个 Markdown 链接或加粗内容,然后多次替换来解决,但是 HTML 表格之外的 Markdown 链接不能被匹配。
我之前尝试用<td([^>]*?)>([\s\S]*?)\[(.*?)\]\((.*?)\)([\s\S]*?)<\/td>替换成<td$1>$2<a href="$4">$3</a>$5</td>,但是([\s\S\n]*?)会匹配表格外的内容。
目前看难点在于如何匹配<td([^>]*?)>和\[(.*?)\]\((.*?)\)之间所有内容(包括换行和空格),如果存在</td>则不匹配该单元格

请问该使用什么样的正则表达式。
2388 次点击
所在节点    程序员
10 条回复
zhuangzhuang1988
2020-02-03 02:11:33 +08:00
应该得用上下文无关文法(CFG)吧
noqwerty
2020-02-03 02:36:01 +08:00
这种情况用 html parser 会比正则省很多脑细胞😂
wwcchn9
2020-02-03 02:38:34 +08:00
理论上来讲,regex 就没有足够的能力 parse CFL,为啥不用 CFG 呢?
xupefei
2020-02-03 02:48:57 +08:00
状态机……
laminux29
2020-02-03 09:43:52 +08:00
正则从理论上来说就是大幅度压缩代码。

一些简单的逻辑,用正则没问题,但太复杂的逻辑,压缩成正则后,可读性、可改性以及可调试性都变得很差。

建议复杂的情况,老老实实写代码,不要用正则。
hakono
2020-02-03 09:58:49 +08:00
搞不懂楼主为什么一定要用正则去匹配,纯粹给自己找麻烦
用 dom 解析器配合 css 选择器选出需要的 html 标签然后用简单的正则把里面需要的文本提取出来不就行了
Kirscheis
2020-02-03 10:48:48 +08:00
计算机科学小常识:不要用正则去处理 HTML,除非是在写那种用完一两次就可以丢掉的爬虫脚本之类的东西
autoxbc
2020-02-03 15:05:34 +08:00
每次你用正则处理序列化的结构数据,就是重新写了一遍这种数据结构的解析器
wwcchn9
2020-02-04 02:15:29 +08:00
@laminux29 扯淡,正则就不足够 parse CFL 是编译原理 101 教的吧。并不是所谓的大幅度压缩代码
laminux29
2020-02-04 05:42:12 +08:00
@wwcchn9 我说的是能大幅度压缩代码,不是说所有代码都能被压缩成正则。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/641743

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX