我有这样的内容:
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
复制相似问题