【问题标题】:JSON Object restructuring advice?JSON对象重组建议?
【发布时间】:2020-04-02 16:18:24
【问题描述】:

我即将着手将大量 JSON 对象数据重组为不同的格式,以用于明年夏天的课程作业。不幸的是,当前状态的数据不能完全满足我的需求,我没有办法以任何其他方式抓取这些数据。抓取的结果返回为;

[
{
"classes": [
  [
    {
      "Friday": "",
      "Monday": "",
      "Tuesday": "",
      "Saturday": "",
      "Thursday": "",
      "Wednesday": ""
    },
    {
      "Friday": "",
      "Monday": "",
      "Tuesday": "",
      "Saturday": "",
      "Thursday": "",
      "Wednesday": ""
    },
    {
      "Friday": "",
      "Monday": "",
      "Tuesday": "",
      "Saturday": "",
      "Thursday": "",
      "Wednesday": "10:00 - 11:00MK4603 - LEC firstname lastname DR KBG121-12"
    }

上面的 sn-p 是针对 10:00 的时间段,(27 个切片代表大学时间。)

看一个典型的键:

10:00 - 11:00MK4603 - LEC firstname lastname DR KBG121-12

它分为以下几个元素。

[10:00 - 11:00][MK4603] [-] [LEC] [firstname lastname DR] [KBG12][1-12]
Time          Module    n/a  Type  Lecturer               Room#  Weeks`

时间以 24 小时为单位,模块将准确包含该长度的字符,类型为:TUT 或 LEC,讲师始终由 DR 终止(如果适用),房间分解为:第一个 1-2 个字母 = 建筑物首字母|下面的字母是带有一个字符的地板 |后面两个数字是楼层号。

但是有时(这是一种极端情况),大学可能会将上述的两个“模板”放在同一个 HTML tr 框中,这将导致 -

10:00 - 11:00MK4603 - LEC 名姓 DR KBG121-12 11:00 - 12:00LI4113 - LEC 先后 DR D10501-12

将这种刺痛和类似刺痛分离成这些组件的最佳方法是什么?我完全能够处理之后的开发,但是我完全不知道如何处理当前格式化的字符串。有人可以就如何解决这个问题提供建议吗?

我在使用 Regex 时取得了一些有限的成功,但我确实制作了这个来查找字符串中的时间:

[(00-24)]*[(:)].{2}

对于这个问题是否有任何人都知道的更优雅或更有创意的解决方案?

【问题讨论】:

  • 大家好,只是一个简短的说明,我知道它当前是一个对象数组,但这将在稍后处理! :)
  • 这种格式总是一样的吗?正如你在模板中列出的那样?
  • 是的!然而,我需要提到的一个小特点是,有时大学在一个 HTML 插槽中提供两个课程,这会将其中两个“模板”转换为同一个键,即; 11:00:11:30 ...(以上关键示例)... 12:00 12:30
  • 请在您的问题中也添加该示例。
  • 另外,在最后一个字符串 KBG121-12 房间号的规则是 LETTER+LETTER+LETTER+DIGIT+DIGIT 吗?然后是几周?

标签: javascript arrays json regex reactjs


【解决方案1】:

您的正则表达式可以在这里找到: https://regex101.com/r/x79lan/1/

下面是对所有规则的解释:

(
    (?P<starts_at>\d\d\:\d\d)         // the format for days, ?P<starts_at> is optional and helps giving the captured group a name. The real rule starts after this naming rule: DIGIT+DIGIT:DIGIT+DIGIT
    \s\-\s                            // space followed by dash followed by space
    (?P<ends_at>\d\d\:\d\d)           // same as starts_at group
    (?P<module_name>[^ ]*)            // capture everything until the first space
    \s\-\s                            
    (?P<module_type>[^ ]*)
    \s
    (?P<first_name>[^ ]*)
    \s
    (?P<last_name>[^ ]*)
    \s
    ([^ ]*)
    \s
    (?P<room>[A-Z]{2,3}\d\d)         // capture 2-3 letters + next two digits 
    (?P<weeks>\d-\d{1,2})            
)\s?                                 // capture everything in this BIG GROUP multiple times (this is for exception rules you added later)

【讨论】:

  • 对此深表感谢,我需要掌握正则表达式以应对未来,这将通过“做事做秀”对我有很大帮助。我真的要感谢您抽出宝贵的时间为我服务! :) 我知道更好的方法是修改我获取数据的方式,但目前的目标是最小的工作原型!
  • @LakeSereni 很高兴我能提供帮助。请询问是否有任何不清楚的地方。还可以尝试使用像 regex101 这样的帮助站点,因为它们在右侧解释了所有内容。 ;-)
猜你喜欢
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 2017-03-27
  • 2013-08-28
相关资源
最近更新 更多