2011-09-14 18 views
2

のような日付形式に一致する正規表現があります:26 August 2011 と私はファイルの各行を読み込み、上記の形式の日付を含む行を取得しようとしています。しかし、それは動作していないようです..
第一ファイルの内容を検索して正規表現

Regex test = new Regex(@"^((31(?!\ (Feb(ruary)?|Apr(il)?|June?|(Sep(?=\b|t)t?|Nov)(ember)?)))|((30|29)(?!\ Feb(ruary)?))|(29(?=\ Feb(ruary)?\ (((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))|(0?[1-9])|1\d|2[0-8])\ (Jan(uary)?|Feb(ruary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sep(?=\b|t)t?|Nov|Dec)(ember)?)\ ((1[6-9]|[2-9]\d)\d{2})$"); 
StreamReader file = new StreamReader(outputFile); 

while ((line2 = file.ReadLine()) != null) 
{ 
    lines.Add(line2); 
    foreach (Match match in test.Matches(line2)) 
    { 
     v += match.Value; 
    } 
} 

オクラホマので、これはシナリオです - 行が含まれている場合:「2011年8月26日」を、その日付を返します。
2nd - 行に "some text etc 26 August 2011"が含まれている場合、nullを返します。

どのようにこの問題に取り組むことができますか?

+1

おそらく 'test'にもっと適切な値を与えることによって? – Jon

+0

私は正規表現テストを追加しました。 –

+2

私はRegexがどのように直感的であるか本当に好きです。 – jim

答えて

3

正規表現の先頭の^には、「行の先頭から一致します」と表示されます。最後の文字は$です。つまり、行は式で終わらなければなりません。したがって、指定した書式の日付以外の行が含まれている場合、正規表現は一致しません。

フロントの^と最後の$を削除します。

+0

Jimに感謝します。これは完全に機能しました。私は間違いだったと思うが、それは別のサイトからコピーして貼り付けるだけだ。私はdd-MMM-yyと2011年8月26日の正規表現を持っている人なら、同じトークンで感謝します。ありがとう –

0

私はあなたがv.Append(line2)

を行う代わりに v += line2で、あなたはおそらく、パフォーマンスのためのStringBuilderを使用するにもかかわらず(例えば v = new StringBuilder())この

StreamReader file = new StreamReader(outputFile); 

while ((line2 = file.ReadLine()) != null) 
{ 
    lines.Add(line2); 
    if (test.IsMatch(line2)) 
    { 
     v += line2; 
    } 
} 

を試してみて、テストをRegex test=new Regex("26 August 2011");

として定義されている推測しています

- UPDATE

最新のあなたが既存のコードを使用して正規表現の最初に^を削除し、最後に$を削除した場合は、提供されている正規表現を使用してswerしてください。

+0

はdatを試して、それぞれの行を返します。 –

+0

日付だけを返し、行の他のテキストをすべて破棄できる方法はありますか? –

+0

あなたは正確に何を試そうとしていますか?ちょうど日付のある行をすべて見つけようとしているのですか、他のテキストを持つことができる行内の日付と一致させようとしていますか? –