如何搜索一些不属于 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
第一个 lookbehind (?<!(?:(?:https?|ftp|file)://|mailto:)(?:www\.)?\S{0,1000})
将检查 pqr
之前是否没有完整的 URL,(?<!\bwww\.\S{0,1000})
lookbehind 将检查 pqr
前面没有 www.
.
假设要搜索的文本是 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
第一个 lookbehind (?<!(?:(?:https?|ftp|file)://|mailto:)(?:www\.)?\S{0,1000})
将检查 pqr
之前是否没有完整的 URL,(?<!\bwww\.\S{0,1000})
lookbehind 将检查 pqr
前面没有 www.
.