所以我正在做练习考试以准备我的Javascript / HTML,其中一个问题是:
我想出的是:
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对象中?分裂后它们是否存储在数组中?他们有索引吗?
请给我任何指示并指出我正确的方向,谢谢!
答案 0 :(得分:3)
因此,这是一个很好地利用捕获组的好机会。
因为您的输入字符串格式严格,您可以使用它来制作正则表达式。让我们从那开始吧。取输入字符串,然后将其分解为应该存在的内容:
/CCC dd yyyy hh:mm:ss/
d
,y
,h
,m
和s
都恰好是一位数:/CCC \d\d \d\d\d\d \d\d:\d\d:\d\d/
/CCC \d{2} \d{4} \d{2}:\d{2}:\d{2}/
jan
,feb
或mar
,因此我们可以将其替换为具有三个选项的非捕获组:/(?: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
/(?: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
但是,这并不能为您提供所需的数据。为此,您需要使用捕获组。对于您需要的每个字段,在与其匹配的字符周围放置一个捕获组。 (或者,对于月份,只需删除?:
即可将非捕获组转换为捕获组。)
/(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代码(以及其他一些语言)。这就是我用来测试我提供的代码的原因。