我正在尝试使正则表达式能够处理像波纹管这样的输入以提取月份和年份,同时处理所有这些不同的情况并像这样提取 2 组(开始和结束):
From August 2017 - September 2018 (output: {August 2017},{September 2018})
From August to September 2018 (output: {August},{September 2018})
July 2009 - August 2019 (output: {July 2009},{August 2019})
De Aout 2019 a July 2020 (output: {Aout 2019},{July 2020})
De Juillet a Aout 2020 (output: {Juillet},{Aout 2020})
Juillet - Aout 2019 (output: {Juillet},{Aout 2019})
Juillet a Aout 2019 (output: {Juillet},{Aout 2019})
我找到了这个正则表达式 here哪个做得很好(regex101 link):
(?P<fmonth>\w+.\d*)\s+\D+\s+(?P<smonth>\D+.\d+)
但它的问题是它不处理第一部分中没有年份的这两种情况:
De Juillet a Aout 2020
From August to September 2018
我认为它缺少排除/忽略特定单词(如“From”和“De”)的部分。
有什么想法或解决方案吗?
请您参考如下方法:
请注意 \D+是一个非常通用的模式,它匹配 August to在From August to September 2018 ,即任何 1+ 个非数字符号。另外,\w匹配字母、数字和 _ s,当你需要匹配月份名称时,只匹配字母可能更合适,为此,你只需要减去\d即可。和 _来自它([^\W\d_])。
您可以使用更精确的正则表达式:
(?P<fmonth>[^\W\d_]+(?:\W+\d+)?)\s+(?:to|a|-)\s+(?P<smonth>[^\W\d_]+\W+\d+)
参见 regex demo
详情
-
(?P<fmonth>[^\W\d_]+(?:\W+\d+)?)- fmonth 组:1+ 个字母和 1+ 个非单词字符的可选序列,后跟 1+ 个数字 -
\s+- 1+ 个空格 -
(?:to|a|-)-to,a或- -
\s+- 1+ 个空格 -
(?P<smonth>[^\W\d_]+\W+\d+)- smonth 组:1+ 个字母,1+ 个非单词字符,1+ 个数字
