regex 如何使用正则表达式匹配字符串中的最后一个匹配项

0yycz8jy  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(204)

大家好,我正在使用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)请帮助。先谢谢你了。

dw1jzc5e

dw1jzc5e1#

上次正则表达式匹配

要获得最后一个匹配,您只需在#scan结果上调用#last

regex = /(\d{2}\:\d{2}:\d{2}|\d{2}\:\d{2})/ # original
# or
regex = /\d{2}(?::\d{2}){1,2}/ # kudos @ctwheels

string = '12:01, 12:02, 12:03:04, 12:05'

string.scan(regex).last
#=> "12:05"

ABC-指标

ABC指标更复杂,需要查看整个方法。但这里有一篇博客文章很好地解释了这一点:Understanding Assignment Branch Condition
另一个选项是更改RuboCop设置中的最大ABC大小。看看RuboCop Configuration Documentation和默认配置(Metrics/AbcSize最大大小默认设置为15)。

thtygnil

thtygnil2#

尝试使用以下表达式:/(\d{2}:\d{2}(:\d{2})?)/g
下面是一个在ruby中运行的例子:

re = /(\d{2}:\d{2}(:\d{2})?)/
str = ' "14:04" and "14:05"'

# Get matches
matches = str.scan(re)

# Get last match
matches = str.scan(re)

# Get last match
lastMatch = str.scan(re).last[0]

# Print last match
puts lastMatch.to_s
# OUTPUT => "14:05"

# Print the match result
str.scan(re) do |match|
    puts match.to_s
end

相关问题