Ruby on Rails项目中如何用正则表达式从JSON提取日期时间?
从JSON中提取日期时间的Ruby正则表达式方案
嘿,我来帮你搞定这个问题!你现在用Ruby 2.5.0搭配Rails 5开发项目,要从给定的JSON里提取日期时间信息对吧?先看你提供的JSON数据,里面的WordText字段有类似0102770005、06...这类疑似日期的内容,咱们一步步来处理:
1. 先解析JSON数据
首先得把JSON字符串转换成Ruby能操作的对象,Rails默认已经包含了json库,直接用JSON.parse就行:
require 'json' # 你的原始JSON字符串 json_content = '{ "Lines": [{ "Words": [{ "WordText": "WELCOME", "Left": 655, "Top": 442, "Height": 23, "Width": 91 }], "MaxHeight": 23, "MinTop": 442 }, { "Words": [{ "WordText": "0102770005", "Left": 752, "Top": 1621, "Height": 23, "Width": 131 }], "MaxHeight": 23, "MinTop": 1621 }, { "Words": [ { "WordText": "06..." }]}]}' # 解析成Ruby哈希 parsed_data = JSON.parse(json_content)
2. 收集所有WordText内容
接下来要把所有Lines下的Words里的WordText都提取出来,方便后续匹配:
# 用flat_map+map嵌套遍历,收集所有WordText值 all_word_texts = parsed_data['Lines'].flat_map do |line| line['Words'].map { |word| word['WordText'] } end # 此时all_word_texts的结果是:["WELCOME", "0102770005", "06..."]
3. 用正则表达式匹配日期时间
根据你提供的示例内容,我们假设要匹配两种情况:
- 类似
DDMMYY的六位日期(比如010277对应1977年2月1日) - 截断的日期(比如
06...,开头两位是日期的一部分)
可以写一个覆盖这两种情况的正则,然后筛选出匹配的内容:
# 定义匹配规则:要么是连续6位数字,要么是两位数字加省略号 date_regex = /\b(\d{6}|\d{2}\.\.\.)\b/ # 筛选出符合规则的文本 matched_dates = all_word_texts.select { |text| text.match?(date_regex) } # 结果会是:["0102770005", "06..."]
如果只想要0102770005里的日期部分(前六位),可以调整正则来提取:
# 提取字符串中的六位日期片段 date_fragments = all_word_texts.flat_map do |text| text.scan(/\d{6}/) end # 结果会是:["010277"]
4. 把提取到的日期转换成日期对象
如果需要把字符串转成Ruby的Date或Time对象,方便后续处理,可以用Date.strptime(指定格式解析更精准):
require 'date' date_fragments.each do |fragment| # 按照DDMMYY的格式解析 parsed_date = Date.strptime(fragment, "%d%m%y") puts "解析后的日期:#{parsed_date}" # 输出:解析后的日期:1977-02-01 end
对于截断的06...,你可以根据业务规则补充处理逻辑,比如假设是当月的6号,或者结合其他上下文补全日期。
小提示
如果你的日期格式和上面的不一样(比如MMDDYY、YYYYMMDD等),只需要调整正则表达式和strptime的格式符就行。另外,Rails里也可以用Time.parse尝试自动解析,但正则匹配更适合这种OCR识别的结构化数据,避免误匹配无关文本。
内容的提问来源于stack exchange,提问作者awsm sid
相关产品推荐
相关产品推荐

