未捕获可选组

Optional group not being captured

我有一大堆记录需要变成 table,像这样:

********************
alwaysThere1=09/2019
alwaysThere2=987456
bunch of stuff 
i dont need
optional=698,00
more stuff i dont need
********************
alwaysThere1=06/2019
alwaysThere2=123658
bunch of stuff 
more stuff 
********************
alwaysThere1=09/2019
alwaysThere2=987699
bunch of stuff
optional=9999,00
stuff more stuff

我能够使用以下正则表达式捕获前两组,但不能捕获第三组,它们可能存在也可能不存在:

^[\*].+?alwaysThere1=(\d\d\/\d\d\d\d).+?alwaysThere2=(\d{6}).+?((:?optional=)[\d,]+)?[^\*]+

我想得到这样的东西:

09/2019;987456;698,00
06/2019;123658;
09/2019;987699;9999,00

但是,在 Notepad++ 上使用替换模式 ;;\n 我只得到这个:

09/2019;987456;
06/2019;123658;
09/2019;987699;

为什么我无法捕获可选组?该模式似乎与整个记录匹配,没有超过。

您可以使用 3 个捕获组并在替换中使用它们。为防止过度匹配,您可以使用重复组和否定前瞻来确保字符串不只以 *.

开头

因为有些部分总是存在的,你可以先匹配前两行的部分。

^\*+\R.*=(\d+/\d{4})\R.*=(\d{6})(?:\R(?!(?:.*=\d+,\d+|\*+)$).*)*(?:\R.*=(\d+,\d+))?(?:\R(?!\*+$).*)*

部分

  • ^ 字符串开头
  • \*+ 匹配 1+ 次 *
  • \R.*= Unicode换行序列,匹配到最后=
  • (\d{2}/\d{4})捕获第1组匹配2位/4位
  • \R.*= Unicode换行序列,匹配到最后=
  • (\d{6})捕获第2组匹配6位
  • (?:非捕获组
    • \R(?!(?:.*=\d+,\d+|\*+)$).* 匹配不包含仅 * 或模式 =\d+,\d+
    • 的行
  • )* 关闭组并重复 0+ 次以匹配所有这些行
  • (?:\R.*=(\d+,\d+))? 可选择匹配包含模式 =\d+,\d+ 的行并捕获 第 3 组
  • 中的逗号数字
  • (?:非捕获组
    • \R(?!\*+$).* 只匹配不包含*的行
  • )* 关闭组并重复 0+ 次以匹配所有这些行

Regex demo

;;

输出

09/2019;987456;698,00
06/2019;123658;
09/2019;987699;9999,00