2015-05-14 2 views
1

Мне нравится получать описание записи календаря, которое программа называла выходы hhal, используя grep. Выход Хал выглядит следующим образом:Как описать необязательный негативный прогноз в регулярном выражении?

20:30-22:30 13.05.2015: Manfred treffen Repeat: FREQ=WEEKLY;BYDAY=WE;WKST=MO 
09.05. - 12.05.2015: Britt Besuch 

В примере, который я хотел бы, чтобы соответствовать Manfred treffen и Britt Besuch. Однако, поскольку вы можете видеть, что первое назначение - повторное назначение, и там для халя добавляет эту информацию к выходу. В этом случае регулярное выражение должно гарантировать, что каждая целая часть, начинающаяся с Repeat:, будет опущена, но, конечно, только в том случае, если она существует.

grep -oP "(?<=:)(.)+(?=Repeat: .+$)" получает меня Manfred treffen но не Britt Besuch

Однако grep -oP "(?<=:)(.)+(?=Repeat: .+$|$)" дает мне описания обоих назначений, но первый с целым «Repeat: ...» часть включала в себя.

Мне кажется, что это необязательный просмотр. Я нашел аналогичный вопрос о stackoverflow, но на самом деле не понимал подход (Greedy match) и не смог его принять для моего случая.

ответ

0

попробовать это один

(?<=\d{4}:).+?(?=Repeat|$) 

Demo

3

Чтобы сократить матч на Repeat: использования этого: 'назад

(?<=:)(.+)(?= Repeat:|$) 

Вместо того, соответствующая всем, начиная с Repeat: до конца, матч только Repeat: с пробелом перед ним. Другими словами, удалите .+$ с вашего вида. Этого достаточно, чтобы остановить совпадение после имени, давая результат, который вы ожидаете.

т.е.

grep -oP '(?<=:).+(?= Repeat:|$)' file 

Demo.

+0

Вам не нужно идти для захвата группы. –

+0

Это будет соответствовать «Britt Besuch, это предложение» в '09.05. - 12.05.2015: Бритт Безуч это предложение « – Kasramvd

+0

странно, в демо он работает. На моем компьютере, однако, я до сих пор получаю всю информационную строку «Repeat:» до конца –

0

Вам не нужно, чтобы добавить repeat в своем регулярном выражении все, что вам нужно, это захват группы после даты с :

\d+\.\d+\.\d+:\s?(\w+ \w+) 

DEMO

Но если вы просто хотите использовать : и вы просто хотите имена и названия 2 части вы можете использовать следующее регулярное выражение:

(?<=:)[a-zA-Z]+ [a-zA-Z]+ 

Если вы не знаете длину имени после : вы можете использовать следующие регулярное выражение:

\d+\.\d+\.\d+:\s?(.+)((?= \w+:)|$) 

Demo

+0

Хорошо, это работает для этого примера. Я должен был добавить, что описания встреч могут отличаться по длине и форме причины. Извините –

+0

@ CutúChiqueño Да, проверьте правильность! – Kasramvd

0
(?m)(?<=(?<!Repeat):).*?(?=Repeat|$) 

Вы можете попробовать this.See демо.

https://regex101.com/r/mT0iE7/19

+0

Это регулярное выражение не дает мне никакого результата вообще, хотя я понимаю идею исключить «Повторить» из появления первого «:» –

+0

@ CutúChiqueño вы используете его с 'grep -P', это будет' grep - P "(? M) (? <= (? vks