2016-08-22 2 views
3

В настоящее время я пытаюсь проанализировать файл разговора в Javascript. Вот пример такого разговора.Игнорирование возвратов каретки в регулярных выражениях

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 

Мой текущий регулярное выражение выглядит следующим образом

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

Мой подход почти нет, и дает мне 4 группы, как ожидается,

{ 
    "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]
не решает проблему. Шаблон просто останавливается и переходит на следующее вхождение.

Для третьего разговора сообщение обрезается при возврате каретки.

DEMO

Любая помощь будет оценен по достоинству!

+0

Вы имеете в виду, что вам нужен способ соответствия любому символу, но CR? Используйте '[^ \ r]'. Или любой символ, но LF? Затем используйте '[^ \ n]'. –

+0

@ WiktorStribiżew Я бы хотел, чтобы шаблон не заканчивался, когда он достигает CR –

+0

Вы имеете в виду CR, как в '0x0D' или 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/ (который является началом даты на следующей строке (линиях)), и если это не так, чтобы захватить всю эту линию.

Вы можете сделать негативный внешний вид немного более конкретным, если вы боитесь, что две цифры, за которыми следует косая черта, могут поразить любые случаи краев. Это увеличивает количество шагов, но сделает их немного более безопасными.

Если пользователь действительно ввел новую строку с последующей датой в этом синтаксисе, у вас могут быть проблемы, так как это прекратит совпадение в этой точке. Я сомневаюсь, что они также будут включать запятую и 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. Не полагайтесь на regex101 при тестировании входов, содержащих символы CR. –

+0

Что касается края, я согласен с тем, что для пользователя было бы необычным ввести точный шаблон, который я исключаю. –

Смежные вопросы