2015-05-14 45 views
1

我喜歡通過使用grep獲取一個程序調用khal輸出的日曆條目的約會描述。 khal的輸出是這樣的:如何在正則表達式中描述可選的負向預測?

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

在我想匹配Manfred treffenBritt Besuch的例子。但是,正如您所看到的,第一個約會是重複約會,而khal則將這些信息添加到輸出中。在這種情況下,正則表達式必須確保從Repeat:開始的每個整個部分都將被省略,但當然只有當它存在時纔會被忽略。

grep -oP "(?<=:)(.)+(?=Repeat: .+$)"讓我 Manfred treffen但不Britt Besuch

然而grep -oP "(?<=:)(.)+(?=Repeat: .+$|$)"給了我兩個約會,但第一個與整個的說明「重複:」 ......包括一部分。

我似乎需要的是一個可選的lookahead。我在stackoverflow上發現了一個類似的問題,但並沒有真正理解這個方法(貪婪的匹配),也不可能爲我的情況採用它。

回答

0

試試這個

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

Demo

3

要剪切的比賽在Repeat:使用此回顧後:

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

而不是一切都開始Repeat:到最後,比賽只Repeat:匹配,與在它前面的空間。換句話說,從你的後方移除.+$。這足以阻止名稱之後的匹配,產生您期望的結果。

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

Demo.

+0

你並不需要去捕獲組。 –

+0

這將匹配'Britt Besuch這是'09.05內的一個句子'。 - 12.05.2015:布里特Besuch這是一個句子' – Kasramvd

+0

奇怪,在演示它的作品。在我的計算機上,但是我仍然得到所有「重複:」信息字符串,直到結尾 –

0

你並不需要與:

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

DEMO添加repeat在你的正則表達式所有你需要的是一個捕獲組日期之後

但如果你只是想用:只想和你的姓名和名稱是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)(?<=(?<!Repeat):)。*?(?=重複| $)」' – vks

相關問題