未捕获可选组

时间:2019-09-20 19:25:03

标签: regex notepad++ regex-group

我有大量的记录需要转成表格,就像这样:

********************
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

但是,在记事本++上使用替换模式\1;\2;\4\n只能得到这个:

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用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

$1;$2;$3

输出

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