我正在尝试创建一个可以接受一般 SQL / Js 日期的正则表达式,例如:
2012 年 2 月 31 日
我已经做了一个正则表达式:
(0[1-9]|[12]\d|3[01])[ ]+(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)[ ]+[12]\d{3}$
但我怎么能告诉正则表达式忽略项目的出现顺序:
所以它可以接受:
Apr 31 2010
2010 Apr 31
...
...
我正在尝试创建一个可以接受一般 SQL / Js 日期的正则表达式,例如:
2012 年 2 月 31 日
我已经做了一个正则表达式:
(0[1-9]|[12]\d|3[01])[ ]+(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)[ ]+[12]\d{3}$
但我怎么能告诉正则表达式忽略项目的出现顺序:
所以它可以接受:
Apr 31 2010
2010 Apr 31
...
...
使用前瞻断言的一种解决方案:
var myregexp = /^(?=.*(\b[A-Za-z]{3}\b))(?=.*(\b\d{1,2}\b))(?=.*(\b\d{4}\b))/;
var match = myregexp.exec(subject);
if (match != null) {
month = match[1];
days = match[2];
year = match[3];
}
解释:
^ # Start of string
(?= # Look ahead to see if the following can be matched:
.* # Any number of characters
( # followed by (capturing this in group no. 1)
\b # Start of word
[A-Za-z]{3} # Three ASCII letters
\b # End of word
) # End of capturing group no. 1
) # End of lookahead assertion.
(?= # Look ahead to see if the following can be matched:
.* # Any number of characters
( # followed by (capturing this in group no. 1)
\b\d{1,2}\b # a one- or two-digit number
) # etc.
)
(?= # Lookahead no. 3
.*
(
\b\d{4}\b # a four-digit number
)
)
您应该将字符分组,然后您可以使用 OR 以它们在字符串中出现的不同顺序接受它们。您无法构建可以处理任何订单的通用正则表达式 - 您必须清楚地指定它们发生的所有订单。