2016-04-01 138 views
5

我使用的API有時會截斷它返回的文本內的鏈接,而不是「longtexthere https://fancy.link」我得到「longtexthere https://fa ...」。正則表達式匹配單詞(url)只有當它不包含字符

我想要匹配的鏈接,只有當它是完整的,或換句話說不包含「...」字符。

到目前爲止,我可以使用以下正則表達式來獲得鏈接:

((?:https?:)?\/\/\S+\/?) 

但顯然它返回的每一個環節,包括打破的。

我一直試圖做這樣的事情:

((?:https?:)?\/\/(?:(?!…)\S)+\/?) 

雖然這開始忽略「...」字,它仍在回覆鏈路只是,而不包括字符,所以用「的情況下, https://fa ...「它返回」https://fa「,而我只是想讓它忽略那個斷開的鏈接並繼續前進。

一直在打這幾個小時,只是無法讓我的頭在附近。 :(

感謝提前任何幫助

+1

您的正則表達式引擎是否允許佔有量詞?試試['(?:https ?:)?\/\/[^ \ s ...] ++(?!...)\ /?'](https://regex101.com/r/jQ9lQ2/1) –

+1

注意你也可以在最後刪除'\ /?',因爲它永遠不會匹配。如果您的正則表達式是JavaScript或Python,請嘗試['(?!\ S + ...)(?:https ?:)?\/\/\ S +'](https://regex101.com/r/jQ9lQ2/2) –

+1

如果你的正則表達式支持所有格量​​詞和lookbehind,你也可以嘗試['(?:https ?:)?\/\/\ S ++(?<!...)'](https://regex101.com/r/jU9jU8/1)如果lookbehind不匹配,所有格量詞將防止回溯。 –

回答

2

您可以使用

(?:https?:)?\/\/[^\s…]++(?!…)\/? 

the regex demo。佔有量詞[^\s…]++將匹配所有非空白字符和非字符,而不會稍後回溯,然後檢查下一個字符是否不是。如果是,則不會找到匹配項。

作爲替代方案,如果你的正則表達式引擎允許佔有慾量詞,使用negative lookahead版本:

(?!\S+…)(?:https?:)?\/\/\S+\/? 

another regex demo。如果1+非空白字符跟在之後,前瞻(?!\S+…)將會使匹配失敗。

+1

確切地說我需要!非常感謝 這裏還會提到@bobblebubble sug從上面gestion:'(?:https?:)?\/\/\ S ++(?<!...)',因爲它似乎相似,但也工作! – kiradotee

+0

是的,它非常相似,因爲它也使用佔有量詞來防止回溯到角色等級。 '\ S ++'匹配所有非空白字符,直到字符串的空白或結尾,然後檢查是否只有前一個字符不是省略號。如果是,則匹配失敗。 –

0

請嘗試:

https?:\/\/[^ ]*?…|(https?:\/\/[^ ]+\.[^ ]+) 

這裏是demo

+0

你能看看這個嗎? https://regex101.com/r/uG7cF1/1 – kiradotee

+0

更新了正則表達式模式。請檢查一下。 – Quinn

+0

很抱歉再次打擾,但請您看看這個嗎? https://regex101.com/r/iB3tK6/1 – kiradotee

1

嘗試:

((?:https?:)?\/\/\S+[^ \.]{3}\/?) 

它與您的原始模式..你只是告訴它,最後三個字符不應該是'。'(句號)或''(空格)

更新:您的第二個鏈接工作。

,如果你調整你的正則表達式稍稍它會做你想要什麼:

((?:https?:)?\/\/\S+[^ …] \/?) 

是的,它看起來就像你有什麼在那裏除了我,我們做了部分後加一個「」(空格)不想要..這將強制正則表達式匹配,直到包含不能使用具有'...'字符的url的空間。如果沒有在最後的空間,將匹配直到不包括「...」這是爲什麼沒有做什麼我們想要;)

+0

我稍微修改了你的名字(因爲它是一個特殊的字符,而不是三個點),儘管它沒有做到這一點https://regex101.com/r/zJ7lM0/1 – kiradotee

+0

由於某些原因,你的網址被阻止爲了我。 :( – Rob

+0

呵呵,你是第一個無法打開regex101.com的人。也許這個鏈接可以工作嗎?http://regexr.com/3d53k – kiradotee

1

你可以試試下面的正則表達式

https?:\/\/\w+(?:\.\w+\/?)+(?!\.{3})(\s|$) 

觀看演示https://regex101.com/r/bS6tT5/3

+0

您可以看看這個例子嗎?https://regex101.com/r/bS6tT5/1 – kiradotee

+0

當然,請參閱https://regex101.com/r/bS6tT5/2。我修改了正則表達式。 – Saleem

+0

但是,只選擇http://google.com和https://google.com? – kiradotee

相關問題