【发布时间】:2018-04-12 18:10:42
【问题描述】:
您好,我正在使用 ruby-2.5.0 和 Rails 5 开发 RoR 项目。我有一个从字符串中查找时间的模式,如下所示:-
time_pattern = /(\d{2}\:\d{2}:\d{2}|\d{2}\:\d{2})/
time = mystr[time_pattern]
它返回字符串中的第一个匹配时间,例如,如果字符串“14:04”和“14:05”中有两个时间,它将始终返回第一个“14:04”。我需要找到第二个。请帮助我使用正则表达式找到第二个匹配项。我也尝试过类似的扫描方法:-
time = params.to_s.scan(time_pattern).uniq.flatten.last
但我的 rubocop 抛出错误 Methods exceeded maximum allowed ABC complexity (1)
请帮忙。提前致谢。
【问题讨论】:
-
可读性建议:
\d\d与\d{2}相同,但缩短了 1 个字符 + 更易读 IMO。此外,您应该能够做到/\d\d\:\d\d(\:\d\d)?/(参见此处:rubular.com/r/UX13pdJZfm)。顺便说一句,使用这个正则表达式,99:99:99匹配 -
@MrYoshiji 但在论点的另一边:
\d\d增加了不必要的计算,但是是的,您的第二部分要好得多\d{2}:\d{2}(?::\d{2})?甚至\d{2}(?::\d{2}){1,2}。另外,:不需要转义。 -
使用
scan,您需要具有非捕获组的版本,我会使用单词边界:params.to_s.scan(/\b\d{2}:\d{2}(?::\d{2})?\b/).uniq.flatten.last -
并回答如何匹配最后一次出现:
params.to_s[/.*(\d{2}:\d{2}(?::\d{2})?)/, 1] -
它仍然返回第一个匹配项。请帮忙
标签: ruby-on-rails regex rubocop