仅当不包含字符时才匹配单词 (url) 的正则表达式

regex to match word (url) only if it does not contain character

我使用的 API 有时会截断 returns 文本中的 link,而不是 "longtexthere https://fancy.link" I get "longtexthere https://fa…"。

我试图匹配完整的 link,或者换句话说,不包含“…”字符。

到目前为止,我可以使用以下正则表达式获得 links:

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

但显然它 returns 每 link 包括损坏的。

我试过这样做:

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

虽然开始忽略“...”字符,但它仍然返回 link 但只是不包括字符,所以在“https://fa…" it returned "https://fa”的情况下,我只是想让它忽略那个坏掉的 link 并继续前进。

我为此纠结了几个小时,就是无法理解它。 :(

提前感谢您的帮助。

请尝试:

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

这里是 demo.

尝试:

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

它和你原来的模式一样..你只是告诉它最后三个字符不应该是'.' (句号)或 ' ' (space)

更新:您的第二个 link 成功了。

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

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

是的,除了我在不需要的部分之后添加了一个 ' ' (space) 之外,它看起来就像你在那里的一样。这将强制正则表达式匹配直到并包括space 它不能与具有 '...' 字符的 url 一起使用。如果没有 space 最后它会匹配直到不包括 '...' 这就是为什么它没有做我们想要的 ;)

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

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

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

您可以使用

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

参见the regex demo。所有格量词 [^\s…]++ 将匹配所有非空白字符和非 字符而无需稍后回溯,然后检查下一个字符是否不是 。如果是,将找不到匹配项。

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

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

参见 another regex demo。如果 1+ 个非空白字符后跟 .

,则前瞻 (?!\S+…) 将无法匹配