我有大量的记录需要转成表格,就像这样:
********************
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;
为什么我无法捕获可选组?该模式似乎与整个记录相匹配,而没有结束。
答案 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次以上以匹配所有这些行 $1;$2;$3
输出
09/2019;987456;698,00
06/2019;123658;
09/2019;987699;9999,00