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

3 回答 3

5

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

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

放入您的代码:

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

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

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

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

于 2013-01-30T05:06:31.443 回答
1

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

\\/Date\((\d{13})(-(\d{4}))?\)\\/

它检查 a\后跟 a/后跟文本Date,后跟括 13 位数字的括号和一个可选序列 of-后跟 4 位数字,然后是必需的\and /

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

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

于 2013-01-30T04:54:33.450 回答
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
于 2013-01-30T06:25:53.573 回答