【问题标题】:regex to match word (url) only if it does not contain character正则表达式仅在不包含字符时才匹配单词(url)
【发布时间】:2016-04-01 13:52:01
【问题描述】:

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

我只在链接完整或不包含“...”字符的情况下尝试匹配链接。

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

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

但显然它会返回每个链接,包括损坏的链接。

我尝试过这样做:

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

虽然它开始忽略“...”字符,但它仍然返回链接,但只是不包含该字符,所以对于“https://fa...”的情况,它返回“https://fa”,而我只是想要它忽略那个断开的链接并继续前进。

已经为此奋斗了好几个小时,但我无法理解它。 :(

提前感谢您的帮助。

【问题讨论】:

  • 您的正则表达式引擎是否允许所有格量词?试试(?:https?:)?\/\/[^\s…]++(?!…)\/?
  • 请注意,您也可以在末尾删除\/?,因为它永远不会匹配。如果您的正则表达式风格是 JavaScript 或 Python,请尝试 (?!\S+…)(?:https?:)?\/\/\S+
  • 如果你的正则表达式支持所有格量​​词和lookbehind,你也可以尝试(?:https?:)?\/\/\S++(?<!…)如果lookbehind不匹配,所有格量词将防止回溯。
  • 哇@WiktorStribiżew 成功了!!!您应该将其发布为答案,因为这是唯一正确的答案。 regex101.com/r/wC7tO5/1
  • 但是正则表达式的味道是什么?哪种模式适合你?

标签: regex url regex-negation regex-lookarounds


【解决方案1】:

你可以使用

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

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

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

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

another regex demo。如果 后跟 1+ 个非空白字符,则前瞻 (?!\S+…) 将导致匹配失败。

【讨论】:

  • 正是我需要的!非常感谢。还将在这里提到上面的@bobblebubble 建议:(?:https?:)?\/\/\S++(?<!…),因为它看起来很相似,但也有效!
  • 是的,它非常相似,因为它也使用所有格量词来防止回溯到字符类中。 \S++ 匹配所有非空白字符,直到空白或字符串结尾,然后检查是否只有前一个字符不是省略号。如果是,则匹配失败。
【解决方案2】:

您可以尝试以下正则表达式

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

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

【讨论】:

  • 是的,它正在跳过以/ 结尾的网址。再试一次。它应该匹配 4。其余不是有效的 url,或者由于您设置的 url 而不匹配。
【解决方案3】:

试试:

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

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

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

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

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

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

【讨论】:

  • 我稍微修改了你的(因为它是一个特殊字符而不是三个点),虽然它没有起到作用regex101.com/r/zJ7lM0/1
  • 由于某种原因,您拥有的网址已被我屏蔽。 :(
  • 呵呵,你是第一个打不开regex101.com的人。也许这个链接会起作用? regexr.com/3d53k
  • @user45173 抱歉,我没有意识到 '...' 是单个 Unicode 字符。我能够通过在 regexr.com 端的模式中添加一个空格来使其工作。查看我的更新。
【解决方案4】:

请尝试:

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

这里是demo

【讨论】:

  • 更新了正则表达式模式。请检查一下。
  • 很抱歉再次打扰您,您能看看这个吗? regex101.com/r/iB3tK6/1
  • @user45173:不错:)新版本怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2017-04-01
相关资源
最近更新 更多