C++ 是否有更有效的方法为日期生成正则表达式字符串

C++ 是否有更有效的方法为日期生成正则表达式字符串,c++,regex,qregexp,C++,Regex,Qregexp,我正在为QT项目寻找一个更有效的正则表达式 以下正则表达式与之匹配的日期字符串: 8 June 2009 2009-06-08 1/31/1971 ca. 1971 circa 1971 about 1971 abt 1971 before 1971 bef 1971 bante 1971 after 1971 aft 1971 apost 1971 between 1970 and 2000 bet 1970 and 2000 btw 1970 and 2000 1970-2000 from

我正在为QT项目寻找一个更有效的正则表达式

以下正则表达式与之匹配的日期字符串:

8 June 2009
2009-06-08
1/31/1971
ca. 1971
circa 1971
about 1971
abt 1971
before 1971
bef 1971
bante 1971
after 1971
aft 1971
apost 1971
between 1970 and 2000
bet 1970 and 2000
btw 1970 and 2000
1970-2000
from 1970 to 2000
est 2000
2000 or 2001
2000 | 2001
2019
1.10.2019
June 2009
6/2019
表达方式:

^((?:Jan|January|Feb|February|Mar|March|Apr|April|May|May|Jun|June|Jul|July|Aug|August|Sep|September|Oct|October|Nov|November|Dec|December)[\t ]+[0-9]{4})|^((?:3[01]|[12][0-9]|0?[1-9])[\t ]+(?:Jan|January|Feb|February|Mar|March|Apr|April|May|May|Jun|June|Jul|July|Aug|August|Sep|September|Oct|October|Nov|November|Dec|December)[\t ]+[0-9]{4})|^([0-9]{4} or [0-9]{4})|(^(?:1[0-2]|0?[1-9])[\/.-][0-9]{4})|(^[0-9]{4}-[0-9]{4})|(^from[\t ]+[0-9]{4}[\t ]+to[\t ]+[0-9]{4})|(^btw[\t ]+[0-9]{4}[\t ]+and[\t ]+[0-9]{4})|(^between[\t ]+[0-9]{4}[\t ]+and[\t ]+[0-9]{4})|(^[\t\n\v\f\r ]*([0-9]{4})$)|(^[0-9]{4}[\t ]+\|[\t ]+[0-9]{4}\b)|(^(?:1[0-2]|0?[1-9])[\/.-](?:3[01]|[12][0-9]|0?[1-9])[\/.-][0-9]{4})|(^est[\t ]+[0-9]{4})|(^after[\t ]+[0-9]{4})|(^before[\t ]+[0-9]{4})|(^bef[\t ]+[0-9]{4})|(^abt[\t ]+[0-9]{4})|(^about[\t ]+[0-9]{4})|(^circa[\t ]+[0-9]{4})|(^ca[^\n\r][\t ]+[0-9]{4})|(^bante[\t ]+[0-9]{4})|(^aft[\t ]+[0-9]{4})|(^apost[\t ]+[0-9]{4})|(^btw[\t ]+[0-9]{4}[\t ]+and[\t ]+[0-9]{4})|(^bet[\t ]+[0-9]{4}[\t ]+and[\t ]+[0-9]{4})|(^[0-9]{4}-(?:1[0-2]|0?[1-9])-(?:3[01]|[12][0-9]|0?[1-9]))
验证结果匹配

我能找到的唯一解决方案是交替分组执行。这是匹配字符串日期列表的合理方法吗


提前谢谢

我将提交已发布的正则表达式,并在必要时以目标正则表达式作为附加检查。谢谢你的评论。

首先,好极了,这是一个模式的野兽。如果引擎没有进行回溯,那么交替分组的成本就不会那么高。如果性能出现问题,请考虑使用可以生成DFAS的正则表达式引擎。但是,如果你所拥有的一切都起作用了,为什么还要搞砸呢?如果你在寻找速度,你可以有一个快速匹配,将可能是日期的元素分离出来,并且只对这些元素应用严格的正则表达式。有没有可能指定某种通用模式来包装所有这些?类似于
01/10/2009-10/10/2009
的东西将能够捕捉间隔和单日,您不需要这种大模式。