2016-09-27 232 views
2

這也許是關於對SO正則表達式可選後綴的100 + 1的問題,但我沒有發現任何,可以幫助我:(正則表達式前綴和後綴可選

我需要提取字符串的一部分從常見的模式:。

prefix/s/o/m/e/t/h/i/n/g/suffix 

使用正則表達式的前綴是恆定的,並且後綴可能不會出現在所有的,所以prefix/(.+)/suffix不符合我的要求印刷圖案prefix/(.+)(?:/suffix)?回報s/o/m/e/t/h/i/n/g/suffix的一部分。 (?:/suffix)?必須以某種方式更貪婪。

我想從這些輸入字符串s/o/m/e/t/h/i/n/g:提前

prefix/s/o/m/e/t/h/i/n/g/suffix 
prefix/s/o/m/e/t/h/i/n/g/ 
prefix/s/o/m/e/t/h/i/n/g 

謝謝!

+0

如果這是整個字符串,可以使用'^ prefix(。*?)(?:\ /(?:suffix)?)?$'作爲一般模式,不確定具體實現(並且正確逃避)在Java中。 –

+0

是的,非常感謝!把它作爲答案,請 – olexd

+0

允許在匹配之前或之後包含字符的輸入,例如'... prefix/s/o/m/e/t/h/i/n/g/suffix。 ..'? – Thomas

回答

4

嘗試

prefix\/(.+?)\/?(?:suffix|$) 

正則表達式需要知道什麼時候比賽已經完成,因此匹配線($)任suffix或結束,並進行拍攝非貪婪

See it here at regex101

+0

特別感謝您的簡短解釋 – olexd

1

嘗試prefix(.*?)(?:/?(?:suffix|$))如果在suffix之後prefix之前允許有字符。

這需要儘可能短的匹配(不情願的量詞),並且前面有三件事情之一:在輸入結束之前的一個斜槓/suffix或輸入結束。在您提供的測試用例中,這將與/s/o/m/e/t/h/i/n/g相匹配,但會匹配prefix/s/o/m/e/t/h/i/n/g/suff這樣的輸入(因爲您不知道/suff是否意味着是匹配的一部分還是後綴中的拼寫錯誤),所以匹配更多。

+0

這隻會使後綴中的'x'可選。 – ClasG

+0

@ClasG你是對的,我會解決這個問題。也忘了'/'。 – Thomas

+0

由於貪婪匹配,第一組將總是消耗整個字符串。 –

相關問題