1

我有一个巨大的文字墙,我需要在其中搜索出生或死亡日期,日期通常采用以下格式:

更多的文字。1942 年 12 月 5日出生于 萨姆纳和更多文本

或者

一些文本于1922 年 8 月 8日出生于州城市,更多文本

或者

一些文本2010 年 11 月 3 日星期三死亡,更多文本

或者

一些文字已于 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})
4

5 回答 5

1

您可以尝试使用惰性重复:(?=born\s|died\s|passed\saway\s)(\w+.*?)(\w+\s\d+,\s\d+)

于 2012-07-12T16:00:42.663 回答
1

这适用于显式捕获组、忽略大小写和忽略模式空白。它可以容忍一些错误的格式(例如额外或缺失的空格) 我敢肯定。

# 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})
)
于 2012-07-12T20:15:41.593 回答
0

它吃掉你的月份单词的问题是因为第二个捕获组 (\w+.*)。如果您考虑一下,一个月将是一个词,任何 \w 都会匹配它。所以你的方法有点缺陷。根据您的示例,日期格式似乎与拼写的月份一致,格式为“月 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+) 
于 2012-07-12T15:58:51.543 回答
0

这对我有用: (?=born\s|died\s|passed\saway\s)(\w+.*?)(\w+\s\d+,\s\d+)

于 2012-07-12T16:01:52.590 回答
0

这个怎么样?

(born|died|passed\saway)\s(\w.*)\s(\w+\s[0-9]{1,2},\s[0-9]{2,4})

它与其他人的相似,但您在后面添加一个空格以确保没有东西被吃掉。此外,通过将 \s 放在括号外而不是每个选项都可以节省一些代码。

于 2012-07-12T17:14:02.490 回答