gpt4 book ai didi

regex - 带有可选前缀的正则表达式中的负后视

转载 作者:行者123 更新时间:2023-12-01 09:04:03 25 4
gpt4 key购买 nike

我们使用以下正则表达式来识别 url(由 this gist 派生自 Jim Gruber)。这是在 Scala 中使用 scala.util.matching 执行的反过来使用 java.util.regex :

(?i)\b((?:https?:(?:/{1,3}|[a-z0-9%])|[a-z0-9.\-]+[.](?!js)[a-z]{2,6}/)(?:[^\s()<>{}\[\]]+)(?:[^\s`!()\[\]{};:'".,<>?«»“”‘’])|(?:(?<!@)[a-z0-9]+(?:[.\-][a-z0-9]+)*[.](?!js)[a-z]{2,6}\b/?(?!@)))

此版本已转义正斜杠,用于 Rubular :

(?i)\b(((?:https?:(?:\/{1,3}|[a-z0-9%])|[a-z0-9.\-]+[.](?!js)[a-z]{2,6}\/)(?:[^\s()<>{}\[\]]+)(?:[^\s`!()\[\]{};:'".,<>?«»“”‘’])|(?:(?<!@)[a-z0-9]+(?:[.\-][a-z0-9]+)*[.](?!js)[a-z]{2,6}\b\/?(?!@))))

以前前端只向后端发送明文,但现在他们允许用户为 url 创建 anchor 标记。因此,后端现在需要识别那些已经在 anchor 标记中的 url except。我最初试图用一个负面的 loohbehind 来完成这个,忽略带有 href=" 的 url。前缀

(?i)\b((?<!href=")((?:https?: ... etc

问题是我们的 url 正则表达式非常自由,识别 http://www.google.com , www.google.com , 和 google.com -给定

 <a href="http://www.google.com">Google</a>

负向回顾将忽略 http://www.google.com , 但是正则表达式仍然会识别 www.google.com .我想知道是否有一种简洁的方法来告诉正则表达式“忽略 www.google.comgoogle.com 如果它们是被忽略的 http(s)://www.google.com 的子字符串”

目前我在 url 正则表达式匹配上使用过滤器(代码在 Scala 中)——这也通过忽略带有 <a href="http://www.google.com">www.google.com</a> 的 url 来忽略链接文本 ( > ) 中的 url前缀和 </a>后缀。如果在正则表达式中执行此操作会使本已复杂的正则表达式更加难以阅读,我宁愿坚持使用过滤器。

urlPattern.findAllMatchIn(text).toList.filter(m => {
val start: Int = m.start(1)
val end: Int = m.end(1)
val isHref: Boolean = (start - 6 > 0) &&
text.substring(start - 6, start) == """href=""""
val isAnchor: Boolean = (start - 1 > 0 && end + 3 < text.length &&
text.substring(start - 1, start) == ">" &&
text.substring(end, end + 3) == "</a>")
!(isHref || isAnchor) && Option(m.group(1)).isDefined
})

最佳答案

<a href=\S+|\b((?:https?:(?:\/{1,3}|[a-z0-9%])|[a-z0-9.\-]+[.](?!js)[a-z]{2,6}\/)(?:[^\s()<>{}\[\]]+)(?:[^\s`!()\[\]{};:'".,<>?«»“”‘’])|(?:(?<!@)[a-z0-9]+(?:[.\-][a-z0-9]+)*[.](?!js)[a-z]{2,6}\b\/?(?!@)))

<a href=(?:(?!<\/a>).)*<\/a>|\b((?:https?:(?:\/{1,3}|[a-z0-9%])|[a-z0-9.\-]+[.](?!js)[a-z]{2,6}\/)(?:[^\s()<>{}\[\]]+)(?:[^\s`!()\[\]{};:'".,<>?«»“”‘’])|(?:(?<!@)[a-z0-9]+(?:[.\-][a-z0-9]+)*[.](?!js)[a-z]{2,6}\b\/?(?!@)))

试试这个。它本质上做的是:

  1. 消耗所有 href 链接,以便以后无法匹配

  2. 不捕获它,因此无论如何它都不会出现在中。

  3. 像以前一样处理其余部分。

查看演示。

http://regex101.com/r/vR4fY4/17

关于regex - 带有可选前缀的正则表达式中的负后视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26317578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com