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

これは私のために働いた:(?= born \ s | die \ 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 に答える
0

月の単語を食べてしまう問題は、2 番目のキャプチャ グループ (\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 に答える