我有这样的内容:
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
...I也尝试了其他一些变体,但它只捕获了7
、7
和6
。
如何捕获7.5
、7
和6.5
您可以在Regex101:https://regex101.com/r/hU3xA0/1上试一试
发布于 2015-12-02 07:16:28
试一试:
\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
。
https://stackoverflow.com/questions/34035881
复制相似问题