【发布时间】:2021-04-11 21:19:47
【问题描述】:
我想做两行的非贪婪匹配,但只包括它们之间出现的另一行。
让我用 ffprobe 的日志来说明这一点:
[FRAME]
media_type=video
stream_index=1
pict_type=P
coded_picture_number=1
display_picture_number=0
[/FRAME]
[FRAME]
media_type=video
stream_index=1
pict_type=B
coded_picture_number=1
display_picture_number=0
[/FRAME]
[FRAME]
media_type=video
stream_index=1
pict_type=P
coded_picture_number=1
display_picture_number=0
[/FRAME]
[FRAME]
media_type=video
stream_index=1
pict_type=I
coded_picture_number=1
display_picture_number=0
[/FRAME]
[FRAME]
media_type=video
stream_index=1
pict_type=P
coded_picture_number=1
display_picture_number=0
[/FRAME]
[FRAME]
media_type=video
stream_index=1
pict_type=I
coded_picture_number=1
display_picture_number=0
[/FRAME]
此日志由视频帧组成。帧以 [FRAME] 开始,以 [/FRAME] 结束。
我想在下一帧中匹配一个 pict_type=B 紧跟其后的 pict_type=I。
显然pict_type=B.*?pict_type=I 在这里不起作用,它会匹配 B P I
我试图将 [/FRAME] 的出现限制为仅 1 次
pict_type=B(.*?[^\[\/FRAME\]]{1})pict_type=I
但它匹配两个 [/FRAME] 只是为了达到 pict_type=I
而且每个视频都有不同的行数,所以用 \r\n 重复做正则表达式行是没有用的
我做错了什么,如何告诉它在我的两个 pict_type 之间只允许一个 [/FRAME] ?
【问题讨论】:
-
这取决于您希望匹配/模式的具体程度。在匹配下一个
pict_type=之前,您应该防止交叉匹配[FRAME]我认为这种模式会给您匹配 regex101.com/r/49VQlK/1 -
嗯,这个模式匹配一切,也许是因为它很贪心。实际上我只想穿过 [/FRAME] 和 [FRAME] 一次。 B 帧的结束帧和 I 帧的开始。但我想排除一个或两个应该是相同的。
-
这里的模式regex101.com/r/o7AgcX/1 与
[/FRAME] and [FRAME] only once交叉对吗?它得到预期的匹配吗? (请注意,您不应使用s标志使点匹配换行符) -
哦,是的,它完全符合我在 regex101 中想要的内容!但是为什么在 Notepad++ 中我得到 0 match ?我禁用与新行匹配的点。 Notepad++ 没有所有的标志设置?
-
@Thefourthbird 好吧,我想通了!我必须删除您的行的第一个 / 以及最后的 /g。你能解释一下他们在这条线上的角色吗?
标签: regex