2013-01-09 45 views
0

了以下文本行的後續出現:正則表達式:如何捕獲模式可能包含一個子串沒有捕捉同一子串

start - before capture text - tocapture - maybe after capture 

我必須可靠地捕獲值「文本 - 一道捕捉」 ,而不會拖動可選的- maybe after capture部件。

  • text - tocapture中的空間虛線空間圖案可能存在也可能不存在。 text - tocapture也可能是一個單詞或有空格。
  • 如果存在- maybe after capture,它將始終以空格連字符開頭,然後是隨機文本。

我需要text - tocapture完全匹配,無論是否存在- maybe after capture

我想出的最好的是:

^start - before capture (.*)(- .*)?$ 

的問題是,它捕獲後一切「文本 - 一道捕捉」,大概是因爲它也包含「 - 」。我已經嘗試了一些負面的lookahead的東西,但沒有運氣。請參閱下面的Rubular輸出。

First Attempt

Second Attempt

+1

'text - tocapture'總是隻包含一個短劃線嗎?如果不是,你會如何區分不同的破折號? –

+0

@Tim,'text - tocapture' _may_包含模式空間 - 破折號空間。 ' - 也許捕捉後'是可選的,但如果存在,將始終以空間破折號空間開始,然後是一些隨機字符串。因此,我的問題是在包含空格破解空間的情況下捕獲「text-tocapture」,並且「可能在捕獲後」。 –

+1

......我開始認爲,如果沒有進一步排除最後一次衝刺,我將無法將它與前面可能存在的衝刺區分開來。 –

回答

0

正確的,我想這應該這樣做:

^start - before capture (.*? - .*?)(- .*)?$ 

在這$1應該可以捕捉到你所需要的。在你的例子中,它捕獲:

1. text - tocapture 
2. - maybe after capture 
+0

這確實匹配,但是(並且我忽略提到這一點 - 現在編輯問題)'text-tocapture'中的space-dash-space模式可能不存在。當我把它放在parens與?量詞,你的表達捕獲在「文本」而不​​是「文本捕獲」上。 –

+0

@ UdiBar-On我相信你的語法是不明確的,在這種情況下。我怎麼能說出「開始 - 在捕獲某些文字之前 - 也是捕獲這個!」之間的區別!和「開始 - 在捕捉一些文字之前 - 但不要捕捉這個!」 – femtoRgon

+0

謝謝@femtoArgon,我得出了同樣的結論。標記爲答案。 –

0

這是正常的:.*捕捉一切,你的第二個部分是可選的。

您的.*因此將捕獲text - tocapture - maybe after capture,併爲第二組留下任何東西。作爲量詞?使得可選的,它是一個空字符串非常高興......

爲了可靠地捕獲你想要的東西,你可以用這樣的:如果我知道你需要什麼

^start - before capture ([^-]+-[^-\s]+).* 
+0

這不會改變任何東西。 –

+0

是的,我知道,我編輯了 – fge

+0

fge,您編輯的表達式與我的文本行不匹配,也沒有替代方式(「開始 - 捕獲文本之前 - 捕獲」),我希望相同的表達式匹配。 –

相關問題