为什么这种积极的外观不起作用?

时间:2013-08-06 11:39:00

标签: java regex lookbehind

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

00777: 50.000 bit/s

并希望捕获50.000 bit / s的部分 我已经创建了一个积极的后视正则表达式:

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

哪个有效,但当:和它之间有更多的空格时 - 就像预期的那样。

所以我这样做了:

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

但这不起作用?!为什么?即使这个表达式也不匹配任何字符串:

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

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

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

实施例:javajavascript

修改

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

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

答案 1 :(得分:0)

在第一个中你可以使用(?<=\d{5}: +)的可变数量的空格,但是像其他答案一样,你的正则表达式引擎可能不支持它。

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

根据经验,我总是开始编写最简单的正则表达式,并依赖于我认为会保留的数据模式。

如果您希望该单元始终位于您所使用的数字之后,并且始终为bit/s,则没有理由不将其作为正则表达式中的字面值包含在其中:

[\d\.]+ bit/s$

然后,如果您在数据中发现异常(例如kbit / s的单位),则可以开始将其转换为更复杂的表达式:

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

使用named capture groups以便稍后引用它们更容易,更易读,因此可以将值乘以单位等。

简历中:如果您真的不需要,请不要使用更高级的功能。