正则表达式可替换两个选项之间的字符

时间:2019-03-14 22:13:20

标签: javascript regex

我正在尝试创建一个优雅的正则表达式来替换以下字符串:

12:00:00 a. m. 对此: 12:00 AM

或也替换: 12:00:23 a.m.12:00 am

我的意思是,我想删除最后一个::00并将a. m.替换为AM

这就是我的想法(但不见了):

"12:00:00 a. m.".replace(/(:*)?(.*\s)/, "");

非常感谢您的帮助:)

3 个答案:

答案 0 :(得分:2)

您可以将此正则表达式与两个捕获组一起使用,以在单个replace中进行操作:

/:\d\d\s*(\w)\.?\s*(\w)\.?/

const func = str => str.replace(/:\d\d\s*(\w)\.?\s*(\w)\.?/, (a, b, c) => {
  return ` ${b}${c}`.toUpperCase();
});

console.log(func('12:12:34 a. m.'));
console.log(func('12:34:56 a.m.'));
console.log(func('12:12:34 pm'));
console.log(func('12:34:56pm'));
console.log(func('12:34:56p.   m'));

答案 1 :(得分:1)

这在某种程度上取决于您想成为什么样的人,但这似乎可行:

function replaceTime(str) {
  return str.replace(/(\d{2}:\d{2}):\d{2}/, "$1")
            .replace(/\s*a\.*\s*m\.*/, " AM");
}
console.log(replaceTime("12:00:00 a. m."));
console.log(replaceTime("12:00:23 a.m"));

答案 2 :(得分:1)

我假设您在这里没有进行任何验证工作。这样,两个链接的raplece()方法就可以完成工作:

str.replace(/^(.*):\d+/, '$1')
    .replace(/([a-z])[. ]*/g, ($0, $1) => $1.toUpperCase())

以上适用于p. m.pm

ES5:

console.log("12:00:00 a. m.".replace(/^(.*):\d+/, '$1')
        .replace(/([a-z])[. ]*/g, function($0, $1) { return $1.toUpperCase(); }))