JavaScript正则表达式解析.NET JSON日期时间

4

我不是正则表达式高手,所以我想寻求帮助来设计一个可以按照以下规则工作的正则表达式:

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']

你看过这个吗?https://dev59.com/i3NA5IYBdhLWcg3wUL5Y - elclanrs
需要转义反斜杠 - 实际上,无论是否有反斜杠,这两个字符串都完全相同,因为 / 不需要转义。 - nhahtdh
是的,我确实意识到了在 Chrome 调试器中玩耍的问题,但 .Net 规范要求它,我想强制执行它。 - opensas
3个回答

5

如果字符串中除了时间和时区之外没有其他数字,您可以使用此正则表达式:

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

将以下代码放入你的代码中:

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

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

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

正则表达式将检查字符串是否符合确切的格式,并提取其中的数字。

我得到了完全相同的答案!(真诚的,没有作弊),但是你先回答了……所以我接受你的答案。 - opensas

1
以下正则表达式检查您所需的限制条件:
\\/Date\((\d{13})(-(\d{4}))?\)\\/

它检查一个以反斜杠\开头,后跟文本Date,后跟括号包含13个数字和可选的一系列-,然后是必需的\/的正则表达式。 \\匹配单个\,因为它是正则表达式中的特殊字符,需要转义。同样的情况也适用于()
从这里,$1匹配括号内的13个数字,$3匹配4个数字(如果存在)。

你能提供完整的 JavaScript 句子吗?我尝试过:new RegExp('\\/Date\((\d{13})(-(\d{4}))?\)\\/').exec('/Date(1330848000000-0800)/'),但它给了我 null。 - opensas
我只有一点儿javascript的知识。让我试试。 - Naveed S
谢谢Naveed,我理解你的想法,但是我好像在转义斜杠方面遇到了麻烦... - opensas
1
我认为 \\\\/Date\\((\\d{13})(-(\\d{4}))?\\)\\\\/ 是你所需要的。 - Naveed S

0

我一直在尝试使用正则表达式,最终终于成功了

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接