1

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

00777: 50.000 bit/s

并且想要捕获 50.000 位/秒的部分,我创建了一个积极的后向正则表达式,如下所示:

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

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

所以我这样做了:

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

但是这样不行?!为什么?即使这个表达式也不匹配任何字符串:

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

我在这里想念什么?

4

2 回答 2

1

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

示例:java,javascript

编辑

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

Matcher m=Pattern.compile("\\d{5}:\\s+(\\S+\\s+\\S+)").matcher(input);
if(m.find())
  value=m.group(1);
于 2013-08-06T11:46:12.423 回答
0

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

最后一个表达式由于数据不匹配任何字符串.,它不是\dchar 类的一部分,您可以使用[\d\.]

根据经验,我总是开始编写最简单的正则表达式来完成它,并且我依赖于我相信会保留的数据模式。

如果您希望该单位始终在您所追求的数字之后,并且它将始终是bit/s,则没有理由不将其作为文字包含在您的正则表达式中:

[\d\.]+ bit/s$

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

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

使用命名的捕获组,以便稍后引用它们更容易和更具可读性,因此可以将值乘以单位等。

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

于 2013-08-06T11:51:52.810 回答