Javascript:使用正则表达式进行拆分和存储?

时间:2016-06-10 15:50:03

标签: javascript json regex

所以我正在做练习考试以准备我的Javascript / HTML,其中一个问题是: Practice exam question

我想出的是:

function check(date_str){
  var split1 = date_str.split(" ");
  var split2 = date_str.split(":");
  var split3 = split1[3].slice(0,2);
  var obj = [
  {"month": split1[0]},
  {"date": split1[1]},
  {"year": split1[2]},
  {"hour": split3},
  {"minute": split2[1]},
  {"second": split2[2]}
  ];
  return obj;

显然没有使用正则表达式,因为问题也问我们。我试过这样做:

(\ W +)(\ d +)(\ d +)(\ d +):(\ d +):(\ d +)

我不知道它是否正确。

我遇到的另一个问题是,我不确定如何将从正则表达式分割的字符串存储到JSON对象中?分裂后它们是否存储在数组中?他们有索引吗?

请给我任何指示并指出我正确的方向,谢谢!

1 个答案:

答案 0 :(得分:3)

因此,这是一个很好地利用捕获组的好机会。

因为您的输入字符串格式严格,您可以使用它来制作正则表达式。让我们从那开始吧。取输入字符串,然后将其分解为应该存在的内容:

  1. 以字符串格式开头:/CCC dd yyyy hh:mm:ss/
  2. dyhms都恰好是一位数:/CCC \d\d \d\d\d\d \d\d:\d\d:\d\d/
  3. 使用精确量词简化:/CCC \d{2} \d{4} \d{2}:\d{2}:\d{2}/
  4. CCC只能是janfebmar,因此我们可以将其替换为具有三个选项的非捕获组:/(?:jan|feb|mar) \d{2} \d{4} \d{2}:\d{2}:\d{2}/
  5. month字段应该不区分大小写,其余的是数字和空格,因此我们可以安全地使用不区分大小写的标记i,而不是直接处理选项:/(?:jan|feb|mar) \d{2} \d{4} \d{2}:\d{2}:\d{2}/i
  6. 最后,说明说元素之间可以有多个空格,所以我们必须在每个空格后添加适当的量词:/(?:jan|feb|mar) +\d{2} +\d{4} +\d{2}:\d{2}:\d{2}/i
  7. 您现在有一个正确的表达式,可以精确匹配您的输入要求: /(?:jan|feb|mar) +\d{2} +\d{4} +\d{2}:\d{2}:\d{2}/i

    但是,这并不能为您提供所需的数据。为此,您需要使用捕获组。对于您需要的每个字段,在与其匹配的字符周围放置一个捕获组。 (或者,对于月份,只需删除?:即可将非捕获组转换为捕获组。) /(jan|feb|mar) +(\d{2}) +(\d{4}) +(\d{2}):(\d{2}):(\d{2})/i

    这为您提供了六个捕获组,每个捕获组对应一个所需的字段。从那里开始,只需要填充新对象的字段。

    这里是完整的代码:

    // Here's the function.
    function check(date_string){
        // Make the pattern and use it to match the date_string.
        var date_pattern = /(jan|feb|mar) +(\d{2}) +(\d{4}) +(\d{2}):(\d{2}):(\d{2})/i;
        var match = date_string.match(date_pattern);
    
        // If it wasn't a match, return null.
        if (!match) return null;
    
        // Otherwise, return a new object from the capture groups.
        return {
            month: match[1],
            date: match[2],
            year: match[3],
            hour: match[4],
            minute: match[5],
            second: match[6]
        };
    }
    
    // This bit is test code.
    var input_string = "Jan 10 2016 10:11:12";
    var result = check(input_string);
    if (result) console.log(JSON.stringify(result,null,2));
    else console.log("Result was null");
    

    希望这有帮助。一旦你完全学会了,正则表达式就是一个很棒的强大工具。

    **编辑:正如另一位评论者所说,Regex101是一个帮助测试和调试正则表达式的神奇工具。我在职业生涯中每天都使用它。还有一个名为repl.it的有用工具,可以编写和执行任意Javascript代码(以及其他一些语言)。这就是我用来测试我提供的代码的原因。