2013-10-28 29 views
0

我想匹配在Java中沒有.jsp/.jspx擴展名的字符串,並且在負向預測模式中遇到很多困難。不能得到負面的Lookahead正則表達式正確匹配

給定一串字符串:

String string1 = "templateName"; 
String string2 = "some/path" 
String string3 = "basic/filename/no/extension" 
String string4 = "some/path/to/file.jsp" 
String string5 = "alternative/path/to/file.jspx" 

我試圖找到前3和相匹配的正則表達式不是最後2

我還以爲正則表達式爲負前瞻會工作。

例:

Pattern p = new Pattern.compile("(.+)(?!\\.jsp[x]?)") 

但是模式似乎符合上述所有字符串。我最初認爲第一組可能太貪婪,所以我嘗試過(。+?),但這也沒有幫助。

這個SO Post做了很好的解釋負面看法,但它不幫助我不幸找到正確的組合。

我錯過了一些明顯的東西嗎?

+0

你的模式說,「如果你能找到不是緊跟着.jsp或.jspx後面的_any_非空字符序列,那麼它是匹配的。「所以當然它會匹配'some/path/to/file.jsp',因爲它可以匹配's','so'或任何其他東西,只要它不包含最後一個斜槓即可。見anubhava的答案。如果字符串的開頭後面跟着一個非空字符序列,後跟'.jsp [x]'(如果'.jsp [x]'在字符串的末尾,那麼第二個字符串使用負向前視)。 – ajb

回答

2

您可以使用negative lookbehind爲:

Pattern p = new Pattern.compile("^(.+)(?<!\\.jspx?)$"); 

或者您可以使用negative lookahead爲:

Pattern p = new Pattern.compile("^(?!.+?\\.jspx?$)(.+)$"); 
+0

感謝您的回答。不幸的是,我不明白這兩種模式是如何工作的。你能提供一些關於這些模式如何匹配的解釋嗎?我從來沒有能夠正確地把握前瞻性或後向外露的結構。 –

+0

@EricB .:關於環視的最佳解釋請訪問以下簡單文檔:http://www.regular-expressions.info/lookaround.html – anubhava

+0

一旦您對我的答案感到滿意,請考慮將其標記爲「已接受」,所以未來面對類似問題的用戶將能夠輕鬆看到。 – anubhava