gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:36:03 26 4
gpt4 key购买 nike

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

最佳答案

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

关于正则表达式 - [\V]、[^\v] 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49369076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com