正则表达式 - [\ _V],[^ \ v]之间的区别是什么?

时间:2018-03-19 17:34:15

标签: regex tabs notepad++

我知道" \ 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 ++匹配得如此不同。谢谢: - )

2 个答案:

答案 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:...)构造的更多信息。

enter image description here

答案 1 :(得分:0)

你想要的表达可能就是这样:

speed=\s*(\d+(?:.\d+)?)x?

对于speed= 2.9xspeed=19.2x以及speed= 1x

形式的字符串