正则表达式只有在不包含字符时匹配单词(url)

时间:2016-04-01 13:52:02

标签: regex url regex-negation regex-lookarounds

我正在使用的API有时会截断它返回的文本中的链接,而不是“longtexthere https://fancy.link”我得到“longtexthere https://fa ...”。

我试图仅在链接完成时匹配链接,或者换句话说不包含“...”字符。

到目前为止,我可以使用以下正则表达式获取链接:

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

但很明显它会返回包括破碎链接在内的所有链接。

我试过这样的事情:

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

虽然开始忽略“...”字符但它仍然返回链接但是没有包含字符,因此在“https://fa ...”的情况下它返回“https://fa”而我只是希望它忽略那个断开的链接并继续前进。

已经打了好几个小时,只是无法理解它。 :(

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

您可以使用

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

the regex demo。占有量词[^\s…]++将匹配所有非空格和非字符,而不会在以后回溯,然后检查下一个字符是否不是。如果是,则不会找到匹配。

作为替代方案,如果您的正则表达式引擎允许占有量词,请使用negative lookahead版本:

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

another regex demo。如果使用(?!\S+…)跟随1个以上的非空白字符,则前瞻将无法匹配。

答案 1 :(得分:1)

尝试:

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

它与原始模式相同..你只需告诉它最后三个字符不应该是'。' (期间)或' ' (空间)

更新:您的第二个链接有效。

如果你稍微调整你的正则表达式,它会做你想要的:

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

是的,它看起来就像你在那里所拥有的,除了我添加了一个' ' (空格)在我们不想要的部分之后......这将迫使正则表达式匹配,直到并包括它不能与具有' ...'的网址的空间。字符。没有最后的空间,它将匹配,直到不包括' ...'这就是为什么它没有做我们想要的;)

答案 2 :(得分:1)

您可以尝试使用正则表达式

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

请参阅演示https://regex101.com/r/bS6tT5/3

答案 3 :(得分:0)

请尝试:

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

这是demo