2011-09-09 37 views
8

我希望有一個正則表達式匹配所有這些:正則表達式可選先行

  1. startabcend
  2. startdef
  3. blahstartghiend
  4. blahstartjklendsomething

,並返回abcdefghijkl

我有以下這適用於情況1和3,但我很難使預見可選。

(?<=start).*(?=end.*) 

編輯:

嗯。不好的例子。實際上,中間的位不是數字,而是前面有一組特定的字符,並且可選地由它繼承。我根據要求更新了輸入和輸出,並添加了第4個示例以迴應某個人的問題。

回答

8

嘗試字裏行間,好像也許你並不想在這裏先行,你真正想要非貪婪.*?

(?<=start).*?(?:end)?$ 

我的猜測是,你要對陣像"start123end",但不希望endstart中匹配的文本展現出來,這樣的話你有環視斷言有約束通常是貪婪的.*

相反,您可以使用非貪婪變體並將該模式​​的右端與$一起錨定。

(或者,如果你能使用捕獲組,你應該這樣做,而不是:

start(.*?)(end)?$ 

,然後就從第一個捕獲組的值。)

1

可選先行無厘頭:

如果它是可選那麼它的確定,如果它匹配,但它也確定,如果它不匹配。而且由於前瞻不會延伸比賽,所以它絕對沒有效果。

因此,可選lookahead的語法是空字符串。

+0

我需要在沒有可選後綴的情況下返回中間位。 –

+0

所以你應該匹配'start456otherstuff'? –

+0

不,但它應該匹配start456endotherstuff,但只返回456。 –

0

爲什麼你需要lookahead?

start(\d+)\w* 

看到它在rubular

5

也許是這樣的:

(?<=start).*?(?=(?:end|$)) 

這將匹配直到「開始」和「結束」或者直到行結束,另外量詞有是非貪婪(.*?

見它here on Regexr

擴展了Regexr上的示例,不僅適用於數字。

2

單靠Lookahead不會完成這項工作。試試這個:

(?<=start)(?:(?!end).)* 

的回顧後位置,你的單詞後「開始」,然後它的其餘部分消耗的一切,直到(但不包括)「結束」的下一次出現。

這裏有一個demo on Ideone.com

1

如果「結束」總是會存在,然後使用: (?<=start)(.*?)(?=end)爲你把OP。既然你說「讓前瞻是可選的」,那麼直到有「結束」或回車。 (?<=start)(.*?)(?=end|\n)。如果你不關心捕獲「結束」組,你可以跳過前瞻,並執行(?:start)?(.*?)(?:end)?,它將在「開始」之後開始,如果它在那裏並且在「結束」之前停止,如果它在那裏。您還可以使用更多的管道「或」模式:(?:start|^)(?:end|\n)