为什么这种积极的回溯不起作用?



我有这个字符串(它只是一个较大字符串的剪切部分):

00777: 50.000 bit/s

并且想要捕获50.000位/秒的部分我在regex后面创建了一个正面的外观,如下所示:

(?<=d{5}: )S+s+S+

这是有效的,但当:和它不喜欢的数字之间有更多的空格时。

所以我做了这个:

(?<=d{5}:s+)S+s+S+

但这不管用?!为什么?甚至这个表达式也不匹配任何字符串:

(?<=d{0,5}).*

我在这里错过了什么?

这是因为许多正则表达式引擎不支持lookbacking中的量词(+*?)。

示例:javajavascript

编辑

由于您使用的是Java,因此可以使用组

Matcher m=Pattern.compile("\d{5}:\s+(\S+\s+\S+)").matcher(input);
if(m.find())
  value=m.group(1);

在第一个答案中,您可以使用(?<=d{5}: +)的可变空间量,但与另一个答案一样,您的正则表达式引擎可能不支持它。

最后一个表达式与任何字符串都不匹配,因为数据上有.,它不是d char类的一部分,可以使用[d.]

根据经验,我总是从编写最简单的正则表达式开始,我相信这些正则表达式会一直存在。

如果你希望单位总是在你想要的数字之后,并且它总是bit/s,那么没有理由不把它作为一个文字包含在你的正则表达式中:

[d.]+ bit/s$

然后,如果你在数据中发现异常,你可以开始把它变成一个更复杂的表达式,比如一个带有kbit/s:的单元

(<value>[d.]+) *(<unit>w+)/s$

使用命名的捕获组,这样以后引用它们更容易、更可读,这样就可以将值乘以单位等。

在简历中:如果你真的不需要,就不要使用更花哨的功能。

最新更新