我正在尝试构建将匹配 URL 中的任何协议的正则表达式
(?:https?|ftp|\w{2,7})://
但我希望如果 'http','https','ftp' 存在,它将占用它们,而不是最长的匹配,例如:
"hdhttp://"
我正在使用re2,所以我不能向前或向后看
特定于 RE2 的答案:
由于在 RE2 中您不能使用环视,您必须拆分模式并使用两个。一种是(https?|ftp)://
,如果找不到匹配项,请使用\w{2,7}://
. 或者,使用您的正则表达式,然后检查匹配项是否包含http://
,https://
或者ftp://
如果是,并且匹配值的长度大于这些字符串,则需要使用这些值而不是匹配项。
.NET 相关答案
您可以使用负前瞻来限制更通用的替代方案:
(?:https?|ftp|(?!\w*(?:https?|ftp):)\w{2,7})://
^^^^^^^^^^^^^^^^^^^^^^
查看正则表达式演示
如果匹配一个 2 到 7 个单词字符并以,或(如果需要,可以添加更多)在 a 之前的子字符串,则(?!\w*(?:https?|ftp):)
否定前瞻将导致匹配失败。\w{2,7}
http
https
ftp
:
在 .NET 中,您也可以为此使用否定的lookbehind(它支持未知宽度模式):
(?:https?|ftp|\w{2,7}(?<!https?|ftp))://
^^^^^^^^^^^^^^^