如何用正则匹配字符串中最后出现的时间?RoR项目技术求助
提取字符串中最后出现的时间(Ruby/Rails)
嘿,这个问题我之前也碰到过!要拿到字符串里最后出现的时间,有两种简单的方法可以解决,我给你详细说说:
方法1:用scan获取所有匹配,再取最后一个
scan方法会返回所有符合正则的结果组成的数组,直接取数组的最后一个元素就搞定了。不过要注意正则里的捕获组会影响返回格式:
不带捕获组的写法(更简洁)
把正则改成非捕获组(用?:),这样scan返回的就是直接的时间字符串数组:
mystr = "这里有14:04,还有14:05,甚至16:30:45" time_pattern = /(?:\d{2}:\d{2}:\d{2}|\d{2}:\d{2})/ last_time = mystr.scan(time_pattern).last # 输出:"16:30:45"
保留原捕获组的写法
如果你不想改原来的正则,因为scan对带捕获组的正则会返回嵌套数组,所以要多一步取值:
time_pattern = /(\d{2}:\d{2}:\d{2}|\d{2}:\d{2})/ times = mystr.scan(time_pattern) last_time = times.last[0] # 从嵌套数组里取出时间字符串
方法2:直接用正则匹配最后一个时间
通过让正则先匹配尽可能多的前置内容,最后捕获目标时间,这样一次匹配就能拿到结果,适合长字符串的场景(不用生成整个匹配数组):
time_pattern = /.+(\d{2}:\d{2}:\d{2}|\d{2}:\d{2})/m match_result = mystr.match(time_pattern) last_time = match_result[1] if match_result # 捕获组1就是最后一个时间
这里的m是单行模式,确保.能匹配换行符,如果你的字符串里没有换行,也可以去掉m,但加上更稳妥。
另外提个小细节:正则里的冒号:不是特殊字符,不需要转义,所以\d{2}:\d{2}就可以,不用写成\d{2}\:\d{2}哦~
内容的提问来源于stack exchange,提问作者awsm sid
相关产品推荐
相关产品推荐

