我正在处理时间和子午线.

我可以有'2:0 a. m.''2:0 am''3:0 p. m.''3:0 pm' 基本上,我想做的就是在first in the second发生的时候改变它.

我的try :

console.info('2:0 a. m.'.replace(/(.*?\s)([ampAMP]*?)/, "$1")); // 2:0 a. m.

这个我真的不明白...

'2:0 a. m.'.replace(/(.*?\s)([ampAMP]).*?([ampAMP])/, "$1"); // 2:0 .

这个不错,但看起来很奇怪,不确定这是不是最好的方法

'2:0 a. m.'.replace(/(.*?\s)([ampAMP]).*?([ampAMP]).*?$/, "$1$2$3");

我几乎无法从时间中删除子午线,但我如何才能在第一个空格之后替换不匹配[aAmMpP]的所有字符?

推荐答案

如果要匹配am或pm,则使用[ampAMP]仅匹配单个字符.如果使用两次,则允许使用无效格式的mm.

你可以让模式匹配更多的变化,并捕捉你想要保留的东西.然后,在替换中,使用捕获组创建所需的格式.

如果点是必填的:

\b(\d{1,2})\s*:\s*(\d{1,2})\s*([ap])\.\s*m\.
  • \b个字的边界
  • (\d{1,2})捕获group 1,匹配1-2个数字
  • \s*:\s*可选空格字符之间的数学:
  • (\d{1,2})捕获group 2,匹配1-2个数字
  • \s*匹配可选空格字符
  • ([ap])捕获group 3,匹配ab
  • \.\s*m\.匹配.可选空格字符m.

请看regex demo.

在替换用法中(因为您已经知道您已经匹配了m个字符)

$1:$2 $3m

const regex = /\b(\d{1,2})\s*:\s*(\d{1,2})\s*([ap])\.\s*m\./;
[
  "2:0 a. m.",
  "2:0 p. m.",
  "3:0 p. m.",
  "3:0p.m.",
  "2:0 am"
].forEach(s => console.log(s.replace(regex, "$1:$2 $3m")));

更多的时间,比如特定的模式,允许秒部分使用可选的数字0-5:

\b([0-1]?[0-9]|2[0-3])\s*:\s*([0-5]?[0-9])\s*([ap])\.\s*m\.

Regex demo

Javascript相关问答推荐

如何根据当前打开的BottomTab Screeb动态加载React组件?

在JS中拖放:检测文件

在执行异步导入之前判断模块是否已导入()

使用Java脚本导入gltf场景并创建边界框

对网格项目进行垂直排序不起作用

将Node.js包发布到GitHub包-错误ENEEDAUTH

如何根据查询结果重新排列日期

使用Reaction窗体挂钩注册日历组件

react 路由如何使用从加载器返回的数据

如何压缩图像并将其编码为文本?

如何用react组件替换dom元素?

浮动标签效果移除时,所需的也被移除

正在发出错误的URL请求

如何在底部重叠多个div?

使用Firebase实时数据库`update`在同一 node 上执行多个更新

使用EXCEL.js模块+node.js分隔标题行中的列

如何在Angular中分离桌面和移动页面并延迟加载每个页面?

如何获取获取器列表

在克隆和不克隆原始列表的情况下将元素添加到数组的最佳方法

Mongoose updateOne()不能传入选项