z JavaScript regex中的PCRE等效项,以匹配所有降价列表项

2022-02-28 00:00:00 regex markdown javascript

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

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

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

我创建此RegEx是为了分离不同的第一级列表元素,并包括元素的子列表标记。

/^(?: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 regex中的字符串位置,可以使用$(?![^])$(?![sS])LIKE模式。您的图案将如下所示

/^(?:d.|[*+-]) [^]*?(?=^(?:d.|[*+-])|$(?![^]))/gm
                                       ^^^^^^^^ 
请参阅regex demo。$(?![^])(或$(?![sS]))匹配紧随其后没有其他字符的行的末尾(因此,字符串的末尾)。

但是,您应该考虑展开惰点部分以使模式更有效地工作。

举个例子:

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

请参阅regex demo

详细信息

  • ^-行首
  • (?:d+.|[*+-])-1+数字加一个点或a*/+/-
  • -空格
  • .*-除换行符之外的任何0+字符都要尽可能多
  • (?:? (?!(?:d+.|[*+-]) ).*)*-0个或多个CRLF或LF行序列,后跟-1+数字和圆点,或*/+/-后跟空格,然后是该行的睡觉。

相关文章