用于解析.net json Datetime 的 javascript 正则表达式

Posted

技术标签:

【中文标题】用于解析.net json Datetime 的 javascript 正则表达式【英文标题】:javascript regular expression to parse a .net json Datetime 【发布时间】:2013-01-13 20:07:55 【问题描述】:

我不是正则表达式专家,所以我寻求帮助,想出一个可以像这样工作的正则表达式:

var regExp = ???

regExp.exec('\/Date(1330848000000-0800)\/') = [..., '1330848000000', '0800']

// optional gmt
regExp.exec('\/Date(1330848000000)\/') = [..., '1330848000000', null]

regExp.exec('\/Date(1)\/') = [..., '1', null]

// gmt required if - is present
regExp.exec('\/Date(1330848000000-)\/') = null

// escaping backslash is required
regExp.exec('/Date(1330848000000-0800)\/') = null
regExp.exec('\/Date(1330848000000-0800)/') = null

// case sensitive
regExp.exec('\/date(1330848000000-0800)\/') = null

// only numbers allowed
regExp.exec('\/Date(1aaa848000000-0800)\/') = null
regExp.exec('\/Date(1330848000000-0a00)\/') = null

我很早就被这样愚蠢的事情困住了:

/\\bla(.*)bla/.exec('\bla123bla') = null // instead of [ ..., '123']

new RegExp('\\\\bla(.*)bla').exec('\bla123bla') = null // instead of [ ..., '123']

【问题讨论】:

你看到了吗? ***.com/questions/1016847/… "需要转义反斜杠" - 实际上,无论有无反斜杠,这两个字符串完全相同,因为/ 不需要转义。 是的,我确实意识到使用 chrome 调试器,但 .Net 规范需要它,我想强制执行它 【参考方案1】:

一直在玩正则表达式,终于搞定了

转义斜杠只是被 javascript 忽略了,所以这就是我提出的解决方案(在 chrome 控制台上测试)

var regExp
undefined

regExp = /^\/Date\((\d+)(?:-(\d+))?\)\/$/
/^\/Date\((\d+)(?:-(\d+))?\)\/$/

regExp.exec('\/Date(1330848000000-0800)\/')
["/Date(1330848000000-0800)/", "1330848000000", "0800"]

regExp.exec('\/Date(1330848000000)\/')
["/Date(1330848000000)/", "1330848000000", undefined]

regExp.exec('\/Date(1)\/')
["/Date(1)/", "1", undefined]

regExp.exec('\/Date(1330848000000-)\/')
null

regExp.exec('/Date(1330848000000-0800)\/')
["/Date(1330848000000-0800)/", "1330848000000", "0800"]

regExp.exec('\/Date(1330848000000-0800)/')
["/Date(1330848000000-0800)/", "1330848000000", "0800"]

regExp.exec('\/date(1330848000000-0800)\/')
null

regExp.exec('\/Date(1aaa848000000-0800)\/')
null

regExp.exec('\/Date(1330848000000-0a00)\/')
null

【讨论】:

【参考方案2】:

如果字符串从不包含除时间和时区之外的任何其他数字,则可以使用此正则表达式:

/(\d+)(?:-(\d+))?/

放入您的代码:

var regex = /(\d+)(?:-(\d+))?/;
// regex.exec...

如果您确实需要验证 从字符串中提取数字:

/^\/Date\((\d+)(?:-(\d+))?\)\/$/

上面的正则表达式将检查字符串是否遵循确切的格式,并提取数字。

【讨论】:

我得到了完全相同的答案! (老实说,没有作弊),但你是第一位的......所以我会接受你的回答【参考方案3】:

以下正则表达式检查您所需的约束:

\\/Date\((\d13)(-(\d4))?\)\\/

它检查 \ 后跟 / 后跟文本 Date 后跟包含 13 位数字的括号和可选序列 - 后跟 4 位数字,然后是必需的 \ 和 @ 987654327@.

\\ 匹配一个需要转义的 \,因为它是正则表达式中的特殊字符。 () 也是如此。

据此,$1 匹配括号内的 13 位数字,$3 匹配 4 位数字(如果存在)。

【讨论】:

你能提供整个 javascript 语句吗?我试过: new RegExp('\\\\/Date\((\\d13)(-(\\d4))?\)\\\\/').exec('\ /Date(1330848000000-0800)\/') 它给了我 null 我对javascript只有一点了解。让我试试。 谢谢 Naveed,我确实理解你的推理,但我似乎在转义斜杠时遇到了麻烦,我猜... 我认为\\\\/Date\\((\\d13)(-(\\d4))?\\)\\\\/ 是您所需要的。

以上是关于用于解析.net json Datetime 的 javascript 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSON.NET 反序列化 DateTime 时如何保留时区? [复制]

JSON.NET 将 +00:00 时区解析为当地时间,但 Z 解析为 UTC

在 Pandas 中解析带有 JSON 时差的 DateTime

#yyds干货盘点# Python3 解决 Json 无法解析 datetime 格式数据

如何解析 DateTime 并将其转换为 RFC 822 日期时间格式?

asp.net 中 DateTime 的 Javascript 序列化没有给出 javascript 日期对象?