您好我正在尝试编写一个与此标准符合字符串中所有月份名称的正则表达式:
通过示例:
june - valid june 2014 - valid 2014 june - valid june 2013 - invalid june 2015 - invalid december - valid december 2013 - valid december 2015 - invalid january - valid january 2015 - valid january 2013 - invalid
我使用以下正则表达式:
^(?:2014\s*|2015\s*(january)|2014\s*(december)|)(january|february|march|april|may|june|july|august|september|october|november|december|)(?:\s*2014|(december)\s*?2013|(january)\s*?2015|)?$
但是当我尝试 2015年1月
时,它会给我“”array(6) {
[0]=>
string(11) "january 2015"
[1]=>
string(0) ""
[2]=>
string(0) ""
[3]=>
string(0) ""
[4]=>
string(0) ""
[5]=>
string(6) "january"
}
或者如果我尝试 2015年1月
array(4) {
[0]=>
string(11) "2015 january"
[1]=>
string(6) "january"
[2]=>
string(0) ""
[3]=>
string(0) ""
}
所以我必须忽略所有空值并找到正确的值
你们可以帮忙吗?
答案 0 :(得分:0)
您尚未撰写要应用正则表达式的语言。
但是,如果正则表达式搜索字符串包含多个标记组,您将始终返回多个字符串,其中大多数字符串为空。
或许可以根据您的要求用一个正则表达式来获得月份,但我不知道如何。
我的建议如下:
首先,在字符串上应用以下正则表达式:
^(?:2014)?[\t ]*(january|february|march|april|may|june|july|august|september|october|november|december)[\t ]*(?:2014)?$
如果此正则表达式返回月份字符串,则完成任务。
但是如果没有返回字符串,则必须对字符串执行第二个正则表达式:
^(?:2015)?[\t ]*(january)[\t ]*(?:2015)?$
如果此正则表达式返回字符串january
,则完成任务。
但如果再次没有返回字符串,则必须对字符串执行第三个正则表达式:
^(?:2013)?[\t ]*(december)[\t ]*(?:2013)?$
如果此正则表达式返回字符串december
,则完成任务。
否则,所有3个正则表达式搜索都返回false,因此没有月份,评估的字符串不包含有效的月份信息。
这个具有多达3个正则表达式搜索的解决方案肯定比具有单个非常复杂的正则表达式搜索字符串的解决方案更快。
答案 1 :(得分:0)
第一次匹配年份和月份使用类似的东西((jan | feb | ...)都是月份名称):
/(\d{4})?(jan|feb|...)(\d{4})?/i
然后,如果每个案例的文本匹配,请进行验证。 (php中的脚本)
if($match[1]=="")
$year=intval($match[3]);
else
$year=intval($match[1]);
if($year==$currentYear-1){
//month($match[2]) should be jan or dec
}else if($year==$currentYear){
//month could be everything
}else{
//invalid year
}