我有这样的内容:
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
...我也尝试了其他一些变体,但它只捕获7
,7
和6
。
如何捕获7.5
,7
和6.5
?
您可以在Regex101上试用:https://regex101.com/r/hU3xA0/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
。