gpt4 book ai didi

javascript -\z JavaScript 正则表达式中等效的 PCRE 以匹配所有 Markdown 列表项

转载 作者:行者123 更新时间:2023-12-03 09:49:43 25 4
gpt4 key购买 nike

我正在尝试将 Markdown 样式列表解析为 HTML。为此,我使用了多个正则表达式,均符合 JavaScript 标准。我知道有几种不同的工具可以做到这一点,但我认为这是练习我的 RegEx 的好方法。但是我遇到了一个问题。

在检索到包含有序列表和无序列表的列表“ block ”后,我需要将该 block 解析为不同的列表项。这些项目有可能被缩进,因此分布在多行中,如下所示:

1. text
2. text
1. text
2. text
* text
* text
- text
+ text
1. text
* text
1. text
* text
1. text
* text

我创建了这个 RegEx 来分隔不同的第一级列表元素并包括元素的子列表 Markdown 。

/^(?:\d.|[*+-]) [^]*?(?=^(?:\d.|[*+-]))/gm

应该实现这些匹配...

What I am trying to acheive

1. text

2. text
1. text
2. text

* text

* text
- text
+ text

1. text
* text
1. text

* text
1. text
* text

但是,这会将除最后一个元素之外的所有列表元素分开,因为我使用正向预测来仅匹配后面跟有另一个列表元素的列表元素。结果是……

What actually happens when using this RegEx

1. text

2. text
1. text
2. text

* text

* text
- text
+ text

1. text
* text
1. text

如您所见,缺少最后一个列表元素。

我的想法是只匹配后面跟着另一个列表元素的列表元素或者匹配后面跟着字符串结尾的列表元素,就像这样。

/^(?:\d.|[*+-]) [^]*?(?=^(?:\d.|[*+-])|$)/gm

这不起作用,因为我使用的是多行标志。 我也不能使用 /Z,因为我正在使用 JavaScript。

有人知道解决这个问题的另一种方法吗? Regex101: see this page for the example

最佳答案

如果您希望匹配具有m 标志的JavaScript 正则表达式中字符串位置的最末尾,您可以使用$(?![^] )$(?![\s\S]) 之类的模式。你的模式看起来像

/^(?:\d.|[*+-]) [^]*?(?=^(?:\d.|[*+-])|$(?![^]))/gm
^^^^^^^^

参见 regex demo . $(?![^])(或 $(?![\s\S]))匹配后面没有其他字符的行的结尾它(因此,字符串的末尾)。

但是,您应该考虑展开惰性圆点部分以使图案更有效地工作。

这是一个例子:

/^(?:\d+\.|[*+-]) .*(?:\r?\n(?!(?:\d+\.|[*+-]) ).*)*/gm

参见 regex demo

详情

  • ^ - 行首
  • (?:\d+\.|[*+-]) - 1+ 位数字和一个点或 */+/-
  • - 一个空格
  • .* - 尽可能多的除换行符以外的任何 0+ 个字符
  • (?:\r?\n(?!(?:\d+\.|[*+-]) ).*)* - 0 个或多个 CRLF 序列或一个LF 行尾未跟 - 1+ 位数字和一个点或 */+/- 后跟一个空格,然后是其余的线。

关于javascript -\z JavaScript 正则表达式中等效的 PCRE 以匹配所有 Markdown 列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59515074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com