正则表达式匹配所有内容直到字符串

Regular expression to match everything up to string

我正在尝试将所有内容匹配到 "ModelFinish" 之前的最后 "Saving*" 行。我几乎可以用负环视来做到这一点(在 Regular expression to match a line that doesn't contain a word 中有描述),但无法在我试图匹配的字符串中使用换行符。我正在使用记事本++并且有一个复选框“。匹配换行符”

输入:

Begin: model 17
Epoch 15800, loss 4051304.017, val_PMAE 6.9
Saving at epoch 15828 with loss: 3974847.290
Saving at epoch 15889 with loss: 3968749.471
ModelFinish: Stop training
Begin: model 18
Saving at epoch 15889 with loss: 3968749.223
Saving at epoch 15889 with loss: 3968749.200
Epoch 15800, loss 4051304.017
ModelFinish: Stop training
Begin: model 19

期望的第一场比赛:

Begin: model 17
Epoch 15800, loss 4051304.017, val_PMAE 6.9
Saving at epoch 15828 with loss: 3974847.290

期望的第二场比赛:

Begin: model 18
Saving at epoch 15889 with loss: 3968749.223

我的尝试(选中“. matches newline”):

^Begin:(?:(?!Saving.*Model).)*$

我的计划是使用 notepad++ 查找我不想要的文本并将其替换为“”,这样我就只剩下每个模型的最终 "loss"。 (即:模型17损失:3968749.471,模型18损失:3968749.200等)

如果使用 \R 匹配换行符以匹配 unicode 换行序列,则不必启用匹配换行符的点。

要在 ModelFinish 之前最后一次出现 Saving 之前匹配,您可以匹配不以 ModelFinish 开头的行并使用 positive先行 (?= 断言后面是换行符和保存。

^Begin:.*(?:\R(?!ModelFinish).*)*(?=\RSaving)
  • ^ 字符串开头
  • Begin:.* 匹配 Begin: 和除换行符之外的任何字符 0+ 次
  • (?:非捕获组
    • \R(?!ModelFinish) 匹配换行符并断言该行不以 ModelFinish
    • 开头
    • .* 匹配除换行符以外的任何字符 0+ 次
  • )*关闭非捕获组并重复0+次
  • (?=\RSaving) 正面前瞻,断言右边是一个换行符,然后是 Saving

Regex demo