问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

使用正则表达式匹配时间格式字符串的小心得

发布网友 发布时间:2022-11-26 05:47

我来回答

1个回答

热心网友 时间:2023-02-14 17:33

"/Date(1546012800000+0800)/",而我需要把它转化成这种格式:2019-05-23 12:34:22(北京时间),并作为入参传给另一个 MAPI 接口。

第一时间想到的解决办法就是看看框架中是否带有这种时间戳处理的功能,发 现大多是直接处理时间戳的,像这种:1554362965,所以需要把得到的时间格 式进行处理一下:
首先括号及括号两边的字符是不需要的,另外,+0800 是时区差,表示北京时 间,所以+0800 也可以不需要。要取出 1546012800000 至少有两种方式,第一 种就是正则表达式,第二种就是字符串截取函数 slice()、substring()、substr()。

解释一下这个正则表达式:
第一个字符“/”是正则表达式的开始,第二个字符“\”是转义符,因为字符串中带 有“/”,属于元字符,所以我们需要用转义符转义一下,/Date 是字符串中的内 容,因为格式不变,这个地方可以直接匹配。然后又出现了“\”,因为后面的
“ (”也是属于元字符,因此我们还是需要“\”转义符,之后的( ) 就是分组,\d 表 示数字,*表示数字在文本中出现零次或连续多次,+号表示以+号结尾,最后 以“/”结束整个正则表达式。

这个方法很大程度上有赖于你所写 的正则表达式是否包含 g,如果没有 g,那么 match() 方法就只能在 str 中执行 一次匹配。如果没有找到任何匹配的文本,match() 将返回 null。否则,它将 返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个 元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配 的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。 index 属性声明的是匹配文本的起始字符在 str 中的位置,input 属性存放的是 你要匹配的文本。如果有 g,则 match() 方法会全局检索,找到 str 中所有匹配 的子字符串,全局匹配到子串时返回的数组中没有 index 属性或 input 属性。 上面的正则表达式还可以这样写,结果也是一样的。

直接从 Date 开始匹配,正则表达式就更简短了。

对于上面这个正则,其他的不用多解释,\w 和+号可以说一说。
\w 用来匹配字母、数字和下划线,而后面的+号表示在文本中连续出现一次或 多次。这个正则中的第三个+号是文本中的+号,由于+号是元字符,所以我们 需要用“\”进行转义一下。 另外再说一个分组的问题,如果上面的字符串我们要把+0800 也匹配进来,可 以在正则表达式中多加一对括号,像下面这样:

第一个正则表达式我们只匹配到了 1546012800000,因为它只能识别 /Date(xxx,上面这个正则表达式还可以识别/Dyzc(,例如:

元字符:有特殊含义,以至于不能表示原本意义的字符。 除了正则表达式,HTML、XML、URL,到处都有元字符,并且他们的元字符 还不一定一样。
HTML:
空格( )不表示空格, 只能用   来表示空格。
大于号(>)不能表示大于号,只能用 < 来表示大于号
URL 中,例如: https://www.baidu.com/?search=x%20y
这个 URL 中的%20 其实是个空格。 因为 URL 规定里面只能包含很少的几十种 字符,其中空格就是被禁用的,不能包含空格,那不能包含空格而用户的确需 要表示空格,怎么办呢?
用另外的东西代表空格,在 URL 中,就是%20
因此
https://www.baidu.com/?search=x%20y
等于
https://www.baidu.com/?search=x y
但是下面这个 url 是不合法,所以要被「转义」为上面这个。
url 或者 cookie 中一般一大堆%数字 1、%数字 2 的,全是%开头的,这都是套 路。
正则表达式中可以用/来把元字符转义成他本来的意思,
/ => / ( => ( + => +
HTML 中是以为&开头,;结尾的。
URL 中是以%开头。
正则表达式是以/开头,/结尾的。

终于说完了正则表达式,下面来说说第二种获取"/Date(1546012800000+0800)/" 中 1546012800000 的方法,个人觉得用字符串截取函数来获取也同样是要抓住
不变点和变点,只有抓住这两个,就很好解决这个问题了。因为返回的时间格 式是固定的,所以我们可以从/开始数,第 6 个(index=6)开始,然后以+号结 束,拿到的刚好是 1546012800000,下面我借助一下 indexOf 来获取到+号的位置:

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。第一个 参数是必须的,就是要检索的字符串值,它还可以传入第二个参数,必须是个 整数,从 0 开始,表示从字符串中开始检索的位置,比如说你想从第 6 个字符 开始检索,就可以传 5,最大的取值就是 str.length-1。如果省略就是从首字符开 始检索。

再说一下 substr()函数: substr()方法返回从指定位置开始的字符串中指定字符数的字符,第一个参数是 指定开始的位置,第二个参数是截取的长度。 这里的第二个参数长度就是用+号的位置减去前面不需要的 6 个字符,得到的就 是我们真正要的时间戳。

而 slice()、substring()就更更简单了了。

slice()和 substring()方法都是返回一个索引和另一个索引之间的字符串。所以这 里只需要传+号的位置就行,而且这两个文法第二个参数都不包含该索引位置的
字符。具体可以参考下面这篇文章。
https://juejin.im/post/59e2af3151882578cf573319
拿到时间戳之后就可以直接用框架中的工具,把 1558281600000 转换成 2019-5- 20 0:0:0。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
QQ炫舞里的紫钻多少钱一个月?有什么好处? QQ炫舞这个炫光叫什么?是不是绝版了? QQ炫舞这个炫光是哪个道具的 元气众生录中的应龙背景是什么? 元气众生录学徒积分换什么好 学徒积分兑换攻略 元气众生录每周礼包买哪些 周礼包购买推荐 H2SO4试剂的相对分子质量为98,密度1.84g/cm3,质量分数为98%_百度知 ... 条件 硫酸500ml,相对分子质量98,密度1.84g/立方厘米 质量分数98% 问题... 相对分子质量:98 密度:1.84g 立方厘米 质量分数:98% 在网上看到药监局的新闻,朋友说以后买不到美瞳了,真的吗? 如何用PS做出这种运动模糊的效果 如何自制水族灯 极速退款要求返款不还 信用卡办理流程有什么? 219升冰柜有多大 刘承霖名字的意思是什么我儿子是14年阴历9月出4,19点27分生的叫这个名好吗 萦组词 萦是什么意思 萦怎么读什么意思(萦怎么读组词) 关于三峡的资料 三峡简介 KPL编程工具是什么啊? 推荐6部印度犯罪题材电影,你看过几部? 苏丹利亚是哪部电视剧 牛难产拉不出来怎么办,难产的原因有哪些 徐志摩那些黯然心动的话是什么意思 洛丽塔的永恒的主题到底是什么? 像洛丽塔一样的女孩 荆棘玫瑰lolita有坑吗 教师资格证报考年龄限制是多少岁 出口货物在船上自己发现有问题,原船退回,需要缴纳关税吗? 天津办公家具哪家批发价格最便宜最好? java 匹配时间的正则怎样写? 正则表达式 匹配看是不是当天时间 老人无人赡养怎么办 移动特惠流量卡年享372g套餐多少钱 如何利用手机连接到电脑上 安全问题cn是什么意思 罗马民法大全的内容是什么? 《民法大全》形成于哪个皇帝期间? 直接转矩控制系统的介绍 深圳读书同学区搬家需要取消前租赁合同吗 我是小司机幼儿园小班教案 梦见黄虫子钻进右手背什么预兆? 自己手机注册的店铺微信可以带走吗 古玩店只注册营业执照可以吗 “菜中之王”是指哪种蔬菜? 它凭什么可以称菜中之王? 那种蔬菜是蔬菜之王 菜中之王指的是什么 全国第四轮学科评估结果公布排名 我想问一下厕所回填前要做防水吗