正则表达式 - [\V]和[^\v]有什么区别?

3
我知道"\v"在正则表达式中表示垂直制表符或空白字符(LF、CR等),因此我使用[^\v]代替[\V]来表示任何非垂直空白字符。但是我发现在notepad++ 7.5中[^\v]无法正常工作。
示例文本来源(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的结果是“2.91”,这是我期望的值。 因此,我尝试使用 [\V],如下所示:
(?s).*speed=\s*\K([\V]*)(?=x.*$)

然后,它们都返回了我期望的相同的捕获值"2.91"。 regex101的结果

因此,我想知道[\V]、[^\v]之间的区别,以及为什么Notepad++的匹配结果如此不同。谢谢:-)


\w\W通常被支持,它们不是单个字符,而是代表许多字符,就像\s\S一样,但我不确定\v是否也是这样工作的。我期望[\V]等同于[V] - tadman
但是,在应用 [\V] 的情况下,101.com 和 notepad++ 都返回了相同的值 2.91。因此,我认为它意味着 [\V] 扮演了类似于 [^\v] 的角色,表示任何不是垂直制表符的字符。 - Thm Lee
\v代表“垂直制表符”或ASCII 11。这与回车(ASCII 13)或换行(ASCII 10)不同。 - tadman
如果 [\V] 等同于 [V],则在最后一行的 “speed=” 后包含“v” 的单词是“video”和“overhead”。为什么会得出这样的结果呢? - Thm Lee
1
Notepad++使用Boost Regex库,而在regex101中,您正在使用PCRE Regex Flavor。在PCRE中,[^\v]似乎被解析为“非垂直空格”,但Boost以另一种方式解析字符类中的\v作为VT符号\x0B[^\v]匹配除VT之外的任何字符。在大多数情况下,请使用[^\r\n]作为解决方法。 - Wiktor Stribiżew
显示剩余6条评论
2个回答

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.*$)
^^^^^^^

请查看非捕获组内的模式修饰符,了解更多关于(?smix:...)结构的内容。

enter image description here


谢谢您详细的回答和好建议。不过,在notepad++中,[\V]在正则表达式中有效指示任何非垂直空白字符。迄今为止,由于我的记忆漏失,我一直误以为[^\v]在notepad++中可行。但实际上是我将它的"懒惰量词"效果误认为是这样。 - Thm Lee
1
是的,\V 的作用与 [\V] 相同,但 \v 的作用与 [\v] 不同。我同意这种不一致性,但无能为力。 - Wiktor Stribiżew

0

你想要的表达式可能是这个:

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

对于形如speed= 2.9xspeed=19.2xspeed= 1x的字符串


很抱歉告诉你,在notepad++和regex101.com中都会导致“无效的正则表达式”结果。你是不是想要这样的东西?speed=\s(\d+(.?)\d)x?** 实际上,在上述情况的捕获组中,我之前使用了更简单的模式,如下所示。.. ([^x])x 而不是 ([^\v])x - Thm Lee
我不知道为什么会多了一个 \,已经修复了。 - tadman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接