我有一个巨大的文字墙,我需要搜索出生或死亡日期,日期通常有以下格式:
更多文字。 Born 1942年12月5日在Sumner和更多文本中
或
在 1922年8月8日,在城市,州出生
或
星期三
或
一些文字去世了 2008年12月19日星期五更多文字
或
一些文字去世 2007年1月11日,更多文字
简而言之,这个日期通常在出生后的单词后面几句话。
我认为获得此约会的最佳方式是使用正则表达式,但如果我在这里错了,请纠正我。
这是我想出的日期,但我还远没有得到日期:
(?=born\s|died\s|passed\saway\s)(\w+.*)(\w+\s\d+,\s\d+)
问题是我的正则表达式完全不起作用,它会吃掉月份字,我该如何纠正这个还是有更好的正则表达式或方法吗?
我知道我可以使用下面的内容来获取日期,但我也需要知道这个事件:
(\w+\s[0-9]{1,2},\s[0-9]{2,4})
答案 0 :(得分:1)
您可以尝试使用延迟重复:(?=born\s|died\s|passed\saway\s)(\w+.*?)(\w+\s\d+,\s\d+)
答案 1 :(得分:1)
这个适用于显式捕获组,忽略大小写,并忽略模式空白。它容忍一些糟糕的格式(例如额外或缺少空格)Overkill我很确定。
# get the event
(?'Event'born|died|passed\saway)
# skip junk (note, not using \s for whitespace)
[ \t].*
#get the date in Month, dd, yyyy form (including abbreviated months)
(?'Date'
(?'Month'
# month can't start unless there's whitespace before it
(?<=\s)
# month can be abbreviated or not
(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Ap(ril)?|May|June?|July?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)
)
\s*
(?'Day'\d{1,2})
\s*,\s*
(?'Year'\d{2,4})
)
答案 2 :(得分:0)
吃掉你的月份字的问题是因为第二个捕获组(\ w +。*)。如果你考虑一下,一个月就会成为一个词,任何\ w都会匹配它。所以你的方法有点缺陷。根据您的示例,似乎日期格式与拼写的月份一致,格式为“month dd,yyyy”。如果我们可以假设这样,我建议调整你的正则表达式以包含12个可能的月份名称,这样它就可以解决你从其他不关心的通配词中“吃掉”月份词...
(?=born\s|died\s|passed\saway\s)(\w+.*)((January|February|March|April|May|June|July|August|September|October|November|December)\s\d+,\s\d+)
答案 3 :(得分:0)
这对我有用: (?=出生\ S |死亡\ S |传递\ saway \ S)(?\ W + *)(\ W + \ S \ d +,\ S \ d +)
答案 4 :(得分:0)
这个怎么样?
(born|died|passed\saway)\s(\w.*)\s(\w+\s[0-9]{1,2},\s[0-9]{2,4})
它与其他人类似,但你在后面添加一个空格以确保没有任何东西被吃掉。此外,通过将\ s放在括号之外而不是每个选项来保存一些代码。