我知道" \ v"表示正则表达式中的垂直制表符或空格(LF,CR等),因此我使用[^ \ v]而不是[\ V]来表示任何不是垂直空格的字符。但我发现[^ \ v]在notepad ++ 7.5中没有用的情况。
示例文本源(ffmpeg日志)
frame=13920 fps= 86 q=-1.0 size= 96512kB time=00:07:44.47 bitrate=1702.2kbits/s speed=2.88x
frame=14068 fps= 87 q=-1.0 size= 98048kB time=00:07:49.41 bitrate=1711.1kbits/s speed= 2.9x
frame=14116 fps= 87 q=-1.0 Lsize= 98954kB time=00:07:51.06 bitrate=1720.9kbits/s speed=2.91x
video:86252kB audio:3826kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 9.852874%
我想捕获ffmpeg进程的最新或最后速度的值,所以我应用了如下的正则表达式
(?s).*speed=\s*\K([^\v]*)(?=x.*$)
并在notepad ++中返回捕获值
2.91x
video:86252kB audio:3826kB subtitle:0kB other streams:0kB global headers:0kB mu
但是,regex101.com result是" 2.91",我期望的价值。
所以我尝试了[\ V],如下所示
(?s).*speed=\s*\K([\V]*)(?=x.*$)
然后,两者都返回了我预期的相同捕获值," 2.91"。 regex101's result
因此,我想知道[\ _V],[^ \ v]之间的区别以及为什么notepad ++匹配得如此不同。谢谢: - )
答案 0 :(得分:1)
Notepad ++使用Boost regex library,而在regex101中,您使用PCRE regex flavor。在PCRE中,[^\v]
似乎被解析为“非垂直空格”,但Boost将字符类中的\v
解析为VT
符号\x0B
。 [^\v]
否定字符类匹配除VT
之外的任何字符。
使用[^\r\n]
作为解决方法,在大多数情况下都适用于许多正则表达式:
(?s).*speed=\s*\K([^\r\n]*)(?=x.*$)
^^^^^^^
或者,在您的情况下,使用(?s:...)
修改器组和第一个.*
使.
匹配垂直空白,而另一个.*
不匹配换行符:
(?s:.*)speed=\s*\K(.*)(?=x.*$)
^^^^^^^
请参阅Mode Modifiers within Non-Capture Groups以了解有关(?smix:...)
构造的更多信息。
答案 1 :(得分:0)
你想要的表达可能就是这样:
speed=\s*(\d+(?:.\d+)?)x?
对于speed= 2.9x
和speed=19.2x
以及speed= 1x