Регулярное выражение для соответствия только первому вхождению, начиная с верхней части текста - PullRequest
0 голосов
/ 05 ноября 2018

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

Функция:

[\n\r].*Sent:\s*([^\n\r]*)

Образец текста:

От: Y Отправлено: понедельник, 6 ноября 2018 г. 6:38 Кому: X

BLA BLA

Спасибо,

От: X Отправлено: понедельник, 5 ноября 2018 г. 8:38 Кому: Y

Привет Y BLA

Спасибо

Ожидаемые результаты:

Monday, November 6, 2018 6:38 AM

В настоящее время возвращается:

 Monday, November 5, 2018 8:38 AM

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Первое вхождение не соответствует, потому что вы начинаете свое регулярное выражение с [\n\r], который соответствует новой строке и отсутствует перед первой строкой в ​​ваших данных примера.

Чтобы получить свои совпадения, вы можете опустить [\n\r].* с начала и добавить To: в конце. Если вы не используете глобальный флаг, вы получите только первый случай, и ваш матч будет в первой группе захвата.

Sent:\s*([^\n\r]*) To:

Regex demo

0 голосов
/ 05 ноября 2018

Ты рядом. Попробуйте это:

Sent:\s?(.*?)\sTo:

Это ищет 'Sent', colon, необязательный белый Space, затем создает Group 1, соответствующее любому числу any char, пока не достигнет белых Space и 'To:' .

Если вы установите глобальный флаг, он будет соответствовать обеим датам, в противном случае - только первой.

Дата будет в Group 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...