解析多行字符串以仅提取匹配的行

解析多行字符串以仅提取匹配的行

我有一个多行字符串,我只想提取与特定模式匹配的行并丢弃字符串的其余部分。

原始字符串:

lorem ipsum dolor sit amet consectetur
nunc KEEP THIS LINE ut massa lorem
DO NOT KEEP THIS LINE aenean blandit
nunc KEEP THIS LINE et justo quis
praesent at velit felis vel

期望的最终字符串:

KEEP THIS LINE ut massa lorem
KEEP THIS LINE et justo quis

我目前拥有的正则表达式是:

(?ms).*?(?-s)^nunc (KEEP THIS LINE.*?$)

我可以用反向引用替换匹配项\1。但是,这无法从最后一个匹配模式的末尾替换到字符串的末尾。

正则表达式:

(?ms).*?(?-s)(^nunc (KEEP THIS LINE.*?$)|(?s:).*?\Z)

成功识别了最后所需行和字符串末尾之间的模式,但我不知道如何删除它。

答案1

替换^(?:nunc (KEEP THIS LINE.*)|.*\n)$\1将实现所需的输出:

  • 由于交替符 ( |),表达式^(?:nunc (KEEP THIS LINE.*)?|.*\n)$将强制匹配整行,而不捕获它(?:指定非捕获组)。

  • 如果行以 开头nunc KEEP THIS LINE\1将引用括号内的内容,即以 开头KEEP THIS LINE并结束于行末的字符串。

  • 如果不是以 开头nunc KEEP THIS LINE.*\n将匹配整行,包括终止换行符。

上述正则表达式在 Perl 中运行良好。

在带有 Windows 换行符的 Notepad++ 中,您可以改用这个:

^(?:nunc (KEEP THIS LINE.*)|.*(\r\n)?)

注意,这只会删除最后一行,而不是删除它。

相关内容