从小时跟踪字符串中捕获完整的十进制数

时间:2015-12-02 05:59:44

标签: regex

我有这样的内容:

2015 11-20 -- #TU 10:30-6 (7.5 hrs)
2015 11-19 -- #TU 10-11; 1-7 (7 hrs)
2015 11-18 -- #TU 9:30-4 (6.5 hrs)

我希望捕获本月和客户代码的小时数。

我用它来匹配本月开头的所有行:

\2015 11-.*#TU

然后添加此内容,目的是捕获一个或多个匹配\d数字或文字.的字符:

\2015 11-.*#TU.*([\d\.]+)\g

...我也尝试了其他一些变体,但它只捕获776

如何捕获7.576.5

您可以在Regex101上试用:https://regex101.com/r/hU3xA0/1

1 个答案:

答案 0 :(得分:1)

请改为尝试:

\2015 11-.*#TU.*\(([\d\.]+)\g

解释发生了什么

它不适合你的原因是因为.*之后的贪婪#TU。贪心量词将匹配尽可能多的字符,同时允许表达式的其余部分保持匹配。你的正则表达式的处理方式乍一看有点不直观。

以以下输入为例:2015 11-20 -- #TU 10:30-6 (7.5 hrs)

以下是您可能会想象您的正则表达式适用于字符串

2015 11-.*#TU.*应匹配2015 11-20 -- #TU 10:30-6 (

然后

([\d\.]+)应与7.5

相匹配

事实上,会发生什么

2015 11-.*#TU.*匹配2015 11-20 -- #TU 10:30-6 (7.

然后

([\d\.]+)5

匹配

为什么我的示例有效?

因为我已经指定了一个文字(字符来终止贪婪量词。我们说的是“尽可能多地匹配”,直到你点击(字符,然后匹配至少一位数字或者匹配,而不是说“只要你在最后一位数字之前就尽可能匹配”。点。

奖金改善

2015 11-.*#TU.*\((\d+(\.\d+)?)

在这里,我已将角色等级[\d\.]更改为\d+(\.\d+)?。这是一个更严格的匹配,因为您会发现它不会匹配错误的输入,例如2015 11-20 -- #TU 10:30-6 (...1.23... hrs)2015 11-20 -- #TU 10:30-6 (.5 hrs)。当然,我假设半小时表示为0.5而不是.5