2016-08-22 46 views
3

現在、会話ファイルをJavascriptで解析しようとしています。このような会話の例を次に示します。この正規表現で改行を無視する

(\d{2}\/\d{2}\/\d{4}),\s(\d(?:\d)?:\d{2})\s-\s([^:]*):\s(.*?)(?=\s*\d{2}\/|$)/gm 

私のアプローチは、ほとんどがあり、予想通り、私に4グループを与えるよう

09/05/2016, 13:11 - Joe Bloggs: Hey Jane how're you doing? what dates are you in London again? I realise that June isn't actually that far away so might book my trains down sooner than later! 
09/05/2016, 13:47 - Jane Doe: Hey! I'm in london from the 12th-16th of june! Hope you can make it down :) sorry it's a bit annoying i couldn't make it there til a sunday! 
09/05/2016, 14:03 - Joe Bloggs: Right I'll speak to my boss! I've just requested 5 weeks off in November/December to visit Aus so I'll see if I can negotiate some other days! 

When does your uni term end in November? I'm thinking of visiting perth first then going to the east coast! 
09/05/2016, 22:32 - Jane Doe: Oh that'll be awesome if you come to aus! Totally understand if it's too hard for you to request more days off in june. 

I finish uni early November! So should definitely be done by then if you came here 
09/05/2016, 23:20 - Joe Bloggs: I could maybe get a couple of days when do you fly into London on the Sunday? 

Perfect! I need to speak to everyone else to make sure they're about. I can't wait to visit but it's so far away! 
09/05/2016, 23:30 - Jane Doe: I fly in at like 7.30am so I'll have that whole day! 

I'm sure the year will fly since it's may already haha 
09/05/2016, 23:34 - Joe Bloggs: Aw nice one! Even if I can get just Monday off I can get an early train on Sunday 

私の現在の正規表現は見え

{ 
    "group": 1, 
    "value": "09/05/2016" 
    }, 
    { 
    "group": 2, 
    "value": "13:11" 
    }, 
    { 
    "group": 3, 
    "value": "Joe Bloggs" 
    }, 
    { 
    "group": 4, 
    "value": "Hey Jane how're you doing? what dates are you in London again? I realise that June isn't actually that far away so might book my trains down sooner than later!" 
    } 

問題が発生したときにメッセージ(グループ4)キャリッジリターンが含まれています。 (サンプルスニペットの3行目のメッセージを参照してください)。

私はいくつかの調査を行い、

[\s\S]
を使用しても問題は解決しません。パターンは単に停止し、次のオカレンスに移動します。

3回目の会話では、メッセージはキャリッジリターンで切断されます。

DEMO

任意の助けいただければ幸いです!

+0

あなたはCR以外の文字と一致する方法が必要なのですか? '[^ \ r]'を使用してください。またはLF以外の文字ですか?そして '[^ \ n]'を使います。 –

+0

@WiktorStribiżewパターンがCRに達するとパターンが終了しないようにしたい –

+0

"0x0D"やCRのようにCRを "ここで終わる"としますか? – Aaron

答えて

2

は、行の最後にスキャンし

(\d{2}\/\d{2}\/\d{4}),\s(\d{1,2}:\d{2})\s-\s([^:]*):\s+(.*(?:\n+(?!\n|\d{2}\/).*)*) 

https://regex101.com/r/sA3sB8/2

を試してみて、その後、最初の新しい行は、日付の開始である( \d\d/で始まっていないことを確認するために繰り返しグループを使用しています次の行に)、そうでない場合は、その行全体をキャプチャすることもできます。

フォワードスラッシュに続く2桁の数字がいずれのエッジケースにも当てられない恐れがある場合は、ネガティブルックアヘッドをもう少し具体的にすることができます。ステップ数が増えますが、わずかに安全になります。

実際に改行を入力した後にその構文で日付を入力した場合、その時点でのマッチングが中止されるため、問題が発生する可能性があります。しかし、そのシナリオを処理する方法の1つになるため、コンマと24時間も含めることはできません。

例:

09/05/2016, 23:36 - Jane Doe: Great! Let me give you my travel details: 

10/01/2016 @ 6am - Arrive at the station 
10/01/2016 @ 7am - Get run over by a drunk horse carriage (the driver and the horse were both sober; the carriage stayed up a bit late to drink) 
10/01/2016 @ 7:15am - Pull myself out from under the carriage and kick at its wheels vehemently. 

09/05/2016, 23:40 - Joe Bloggs: Haha, sounds great. 

これは(それを処理するために先読みに多くの詳細を追加するcorresponding fixとの)単なる一例であるだけで、ユーザーできたテキストを追加する方法を表示しますその正規表現の特定のリビジョンを壊します。

+0

パーフェクト、私はそれを考えなかった。ありがとう@OnlineCop! –

+0

regex101はCRLFエンディングをサポートしていないので、LFだけがあります。 CRシンボルを含む入力をテストするときはregex101に頼らないでください。 –

+0

エッジケースについては、私が除外した正確なパターンをユーザが入力することは珍しいことに同意します。つまり、誰かが特別に機能を破りさせるまで、 –

関連する問題