我有这个字符串(它只是一个较大字符串的剪切部分):
00777: 50.000 bit/s
并希望捕获50.000 bit / s的部分 我已经创建了一个积极的后视正则表达式:
(?<=\d{5}: )\S+\s+\S+
哪个有效,但当:和它之间有更多的空格时 - 就像预期的那样。
所以我这样做了:
(?<=\d{5}:\s+)\S+\s+\S+
但这不起作用?!为什么?即使这个表达式也不匹配任何字符串:
(?<=\d{0,5}).*
我在这里缺少什么?
答案 0 :(得分:1)
这是因为许多正则表达式引擎不支持量词(+
,*
,?
)。
实施例:java
,javascript
修改强>
由于您使用的是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以便稍后引用它们更容易,更易读,因此可以将值乘以单位等。
简历中:如果您真的不需要,请不要使用更高级的功能。