regex Markdown表语法的正则表达式?

gcuhipw9  于 2023-05-19  发布在  其他
关注(0)|答案(5)|浏览(128)

我目前正在开发a little tool,它允许我将Github wiki转换为Github页面。现在,我正在尝试添加对Markdown表的适当支持(我正在使用的解析器不支持)。
现在我连接到解析器的词法分析器,然后用各种Github wiki特定的调整(例如:链接),然后将修改后的令牌传递回解析器。表也应该适合此方案。我的调整使用各种正则表达式模式和正则表达式替换来执行我需要的修改。
不过,我对复杂的表语法有点困惑。你可以找到一个herehere的例子。正如你所看到的,有一些结构,但有些部分是完全可选的。
我已经考虑过了,我想我会喜欢一个正则表达式,它会输出一个包含标题(第一行)、列对齐数据(第二行)和实际内容的组作为单独的组。它应该至少包含一个内容行,以便匹配。标题和对齐数据也必须遵守某些规则,如示例中所示。
如何构建这样的正则表达式?更好的是,有人能为我提供一些起点吗?我的方法可能被误导了(也许regex可以避免?)。如果是这样,任何想法导致同样的结果更容易被赞赏。

kmpatx3s

kmpatx3s1#

我需要一个正则表达式来解决同样的问题。以下是我到目前为止得到的,将更新它,因为我能够改进它:

|(?:([^\r\n|]*)\|)+\r?\n\|(?:(:?-+:?)\|)+\r?\n(\|(?:([^\r\n|]*)\|)+\r?\n)+

Debuggex Demo
使用javascript进行测试

zte4gxcn

zte4gxcn2#

我也遇到了同样的问题,一直没有找到合适的答案,最终我想出了下面的答案。

^(\|[^\n]+\|\r?\n)((?:\|:?[-]+:?)+\|)(\n(?:\|[^\n]+\|\r?\n?)*)?$

标志为“全局”和“多行”。
虽然它并不是真正基于Sean's answer,但它最终确实非常相似,有一些显着的差异,例如更短,完成步骤更少(根据www.example.com,59步对126步regex101.com),并且可能具有更“明智”的捕获组。此外,它还允许“不完整”的表。(没有“身体”)。(我之所以在另一个单独的答案中加上它,是因为我真的觉得它更有用,再加上我的自我不允许我这样做);).
简而言之:

  • 它只允许“严格”的markdown表格,其中每一行都以|字符开始和结束,并且“单元格对齐”行的格式正确。
  • 第一组捕获“头部”,第二组捕获“单元格对齐”行,第三组(可选)捕获“主体”。
  • 它需要至少一个完整的和正确格式化的“对齐”单元格才能将其视为表格,但将匹配不完整的表格(即没有“身体”)。

在Java,(Android)和这里测试:
Regex101
这里:
Debuggex Demo
希望能帮到别人。:)

gstyhher

gstyhher3#

我做过的事:
1.正则表达式解析表头和分隔符!!
[|]?(\s+[A-Za-z0-9 -_*#@$%:;?!.,\/\\]+\s+)[|]?[|]?(\s+[A-Za-z0-9 -_*#@$%:;?!.,\/\\]+\s+)[|]?[|]?(\s+[A-Za-z0-9 -_*#@$%:;?!.,\/\\]+\s+)[|]?\r?\n?\|?:-+:\|?:-+:\|?:-+:\|?

  • 修饰符-全局
    1.用于标头和文本之间分隔符的正则表达式
    \|?:-+:\|?:-+:\|?:-+:\|?\r?\n?
    -- modifier - global
    1.正则表达式用于解析头分隔符前后的所有元素!
    [|]?(\s+[A-Za-z0-9 -_*#@$%:;?!.,\/\\]+\s+)[|]?[|]?(\s+[A-Za-z0-9 -_*#@$%:;?!.,\/\\]+\s+)[|]?[|]?(\s+[A-Za-z0-9 -_*#@$%:;?!.,\/\\]+\s+)[|]?\r?\n?
  • 修饰符-全局,多行
    这是一个表,用于解析。
    | Tables | Are | Cool | |:-------------:|:-------------:|:-----:| | col 3 is | r-l | $1600 | | col 2 is | centered | $12 | | zebra stripes | are neat | $1 |
k0pti3hp

k0pti3hp4#

我最终跳过了Regex,只是使用传统逻辑将其整合在一起。它可能不像基于正则表达式的那样漂亮或简短,但至少我可以轻松地维护它。
顺便说一句,我确实找到了一些可能符合这个目的的正则表达式。参见MultiMarkdown

c8ib6hqw

c8ib6hqw5#

我想出了一个非常简单的解决方案,在md中查找表,然后对它们进行一些操作(分别在每个表上)。
解决方案是获取所有以换行符后的垂直线开始的行(|)。这是在Js中:

const findTables = (md) => {
   const tables = md.match(/(\n\|([^\n])*\|)*/g);
   return tables?.map((t) => t.replace("\n", "")).filter((t) => t);
 }

如果表里面的语法不正确(行、列等),它还是会得到它。
所以,真的很天真,但得到了Markdown文件中的所有表作为一个数组。

相关问题