未捕获可选组
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+ 次以匹配所有这些行
;;
输出
09/2019;987456;698,00
06/2019;123658;
09/2019;987699;9999,00
我有一大堆记录需要变成 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+ 次以匹配所有这些行
;;
输出
09/2019;987456;698,00
06/2019;123658;
09/2019;987699;9999,00