Markdown表语法的正则表达式?

时间:2012-03-23 10:50:40

标签: regex github syntax markdown

我目前正在开发a little tool,它允许我将Github wikis转换为Github页面。现在我正在尝试为Markdown表添加适当的支持(我正在使用的解析器不支持)。

现在我连接到解析器的词法分析器,然后使用各种Github wiki特定的调整(即链接)扩展它,然后将修改后的标记传递回解析器。表格也应符合此方案。我的调整使用各种正则表达式和正则表达式替换,以执行我需要的修改。

但是,我对复杂的表语法有些困惑。您可以找到herehere的示例。你可以看到有一些结构,但有些部分完全是可选的。

我已经考虑过了,我想我想要一个正则表达式,它会输出一个包含标题(第一行),列对齐数据(第二行)和实际内容作为单独组的组。它应包含至少一个内容行以便匹配。标题和对齐数据也必须遵守某些规则,如示例所示。

你会如何建立像这样的正则表达式?更好的是,有人可以为我提供一些建立起点的起点吗?我的方法可能被误导(也许可以避免正则表达式?)。如果是这样的话,任何导致相同结果的想法都会受到赞赏。

4 个答案:

答案 0 :(得分:4)

我需要针对同一问题的正则表达式解决方案。这是我到目前为止所做的,将更新它,因为我能够改进它:

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

Regular expression visualization

Debuggex Demo

使用javascript

进行测试

答案 1 :(得分:2)

我做过的事:

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

    1. 用于标题和文本之间分隔符的正则表达式
    2. \|?:-+:\|?:-+:\|?:-+:\|?\r?\n?
      - 修饰符 - 全局

      1. 用于解析标题分隔符之前和之后的所有元素的正则表达式!
      2. [|]?(\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 |

答案 2 :(得分:1)

我最终完全跳过正则表达式,并使用传统逻辑将它们整合在一起。它可能不像基于正则表达式那样漂亮或短,但至少我可以轻松地保持这一点。

我确实找到了一些可能符合此目的的正则数据集。请参阅MultiMarkdown

答案 3 :(得分:1)

我遇到了同样的问题,却没有找到合适的答案,我最终提出了以下建议。

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

标记是“全局”和“多行”。

尽管它并不是真的基于Sean's answer,但最终确实非常相似,但有一些显着差异,例如更短,完成的步骤更少(根据regex101.com,分别为59步和126步) ),并且可能拥有更多“明智”的捕获群体。另外,它也允许“不完整”表。 (因为没有“身体”)。 (我之所以将其添加到单独的答案中,是因为我确实确实发现它更有用,而且我的自我不允许我这样做);)。

简而言之:

  • 它仅允许使用“严格的”降价表,其中每行以|字符开头和结尾,并且“单元格对齐”行的格式正确。
  • 第一组捕获“头部”,第二组捕获“单元格对齐”行,(可选)第三组捕获“身体”。
  • 它需要至少一个完整且格式正确的“对齐”单元格才能将其视为一张表,否则将与不完整的表匹配(即没有“ body”)。

在Java(Android)和此处进行过测试:

Regex101

和此处:

Debuggex Demo

希望它可以帮助某人。 :)