2

我正在尝试构建将匹配 URL 中的任何协议的正则表达式

(?:https?|ftp|\w{2,7})://

但我希望如果 'http','https','ftp' 存在,它将占用它们,而不是最长的匹配,例如:

"hdhttp://"

我正在使用re2,所以我不能向前或向后看

4

1 回答 1

1

特定于 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}httphttpsftp:

在 .NET 中,您也可以为此使用否定的lookbehind(它支持未知宽度模式):

(?:https?|ftp|\w{2,7}(?<!https?|ftp))://
                     ^^^^^^^^^^^^^^^

查看.NET 正则表达式演示

于 2017-02-14T23:16:57.450 回答