如何搜索一些不属于 url 的文本?

How can one search for some text which is not part of a url?

假设要搜索的文本是 pqr

"http://abc.zzz/pqr/xyz"      -> Should not match
"/pqr/"                       -> Should Match
"pqr"                         -> Should Match
"http://abc.zzz/pqr/pqr/"     -> Should not match
"http://abc.zzz/pqr/pqr/ pqr" -> Should match the last "pqr"
"www.pqr.zzz"                 -> Should not match

我尝试使用以下正则表达式,

((?:(?:(?:https?|ftp|file|mailto):)|www)[^ ]+?)?(pqr)

然后我寻找 group 1,如果它是空的,那么我认为它是一个匹配项。但这对于 http://abc.zzz/pqr/pqr/

是失败的

这里对检测要匹配的文本是否不属于 url 有帮助吗?

我认为最坏的情况是先检测所有url,然后存储匹配的url的开始和结束索引。然后尝试匹配 pqr 并排除所有属于 url 的那些。我在想有没有什么地方可以做得更好

考虑到您正在使用 Java,您可以利用 Java 正则表达式引擎支持的 constrained-width lookbehind。这意味着您可以在模式中使用 {n,m} 限制量词。现在,Java 8 supports even * and + quantifiers inside a lookbehind(虽然是非官方的),但这是一个错误,很可能会在下一个版本中修复。因此,你可以使用一些范围,比如0 to 1000(因为link不可能包含超过1K的符号,但你可以根据实际情况调整它):

 (?<!(?:(?:https?|ftp|file)://|mailto:)(?:www\.)?\S{0,1000})(?<!\bwww\.\S{0,1000})pqr

regex demo

第一个 lookbehind (?<!(?:(?:https?|ftp|file)://|mailto:)(?:www\.)?\S{0,1000}) 将检查 pqr 之前是否没有完整的 URL,(?<!\bwww\.\S{0,1000}) lookbehind 将检查 pqr前面没有 www..