测试字符串是否以 http:// 或 https:// 开头的正则表达式

247

我想设置一个正则表达式,用于检查字符串的开头是否包含http://https://,如果包含,则匹配。

我该如何做?我正在尝试以下代码,但它并不起作用:

^[(http)(https)]://

5
如果您只是检查字符串的开头,直接将字符串的前几个字符与您要查找的模式进行比较可能会更快。 - templatetypedef
3
你可以使用 [] 来创建一个 字符组。它将匹配 一个 字符,可以是 ()http 或者 s 中的任意一个。例如,它会匹配 s://,但不会匹配 ht:// 或者 x:// - Felix Kling
2
@templatetypedef:我觉得我感觉到了一些过早的优化。 - cdhowie
4
许多现代正则表达式库非常快。除非有(大量的)回溯,否则正则表达式可能比“index-of”风格的方法更优或同等。例如比较/^x/indexOf(x) == 0。"以...开头"风格的方法可能具有更少的开销,但我认为这很少会有影响——选择最干净的方式即可,例如:x.StartWith("http://") || x.StartsWith("https://"),但请出于代码清晰度的考虑这样做,而不是试图通过这种方式提高性能,除非根据分析和需求进行证明。 - user166390
9个回答

441
你使用的 [] 是不正确的 -- 请注意 [] 表示一个字符类,因此只能匹配一个字符。表达式 [(http)(https)] 的意思是 "匹配一个 (,一个 h,一个 t,一个 t,一个 p,一个) 或者一个 s" (重复的字符会被忽略)。
请尝试以下内容:
^https?://

如果你真的想要使用替代语法,可以使用以下语法:
^(http|https)://

3
作为 PHP 的输入字符串:$regex = '/^(https?://)'; - Steve Tauber
12
Steve,我认为你在结尾处漏掉了一个斜杠:“$regex = '/^(https?://)/';”。 - Axi
16
万一有些人不小心将HTTP的字母大写了,$regex = '/^(https?://)/i'; 可以用于检测网址是否以HTTP或HTTPS开头。 - jeffkee
3
你忘记使用 \ 对斜杠进行转义了。所以正确的写法应该是 ^https?:\/\/。我说得对吗? - Shafizadeh
4
在正则表达式中,/ 并不是特殊字符,而是在某些编程语言中用于表示字面正则表达式的符号。例如,在使用 C# 的正则表达式时,不需要转义 /,因为 C# 正则表达式部分是作为字符串字面量表示的。同样,在 Perl 中(当使用替代定界符 m#^https?://# 时),也不需要转义。因此,针对您的评论直接回答:(a) 不,我没有忘记转义任何字符。(b) 您需要转义在您选择的编程语言中被视为特殊字符的任何字符。 - cdhowie
显示剩余3条评论

53

不区分大小写:

var re = new RegExp("^(http|https)://", "i");
var str = "My String";
var match = re.test(str);

33

^https?:\/\/(.*)其中(.*)匹配的是https://之后的所有内容。


33
^https?://

根据上下文,你可能需要转义斜杠。


20

这应该可以工作

^(http|https)://

2

(http|https)?:\/\/(\S+)

这对我很有效。

虽然我不是正则表达式专家,但我会尝试解释答案。

(http|https):括号表示捕获组,“|”表示或语句。

\/\/:反斜杠允许特殊字符,例如“/”。

(\S+):任何非空格字符直到下一个空格。


你能提供更多关于它如何工作的细节吗?并使用 `` 来标记代码,以使答案更清晰。 - darclander

2

^代表字符串模式的开始

?表示允许0或1次重复。例如,s?表示s可以出现1次或根本不需要出现。

/是正则表达式中的特殊字符,因此需要通过反斜杠\/进行转义。

/^https?:\/\//.test('https://www.bbc.co.uk/sport/cricket'); // true

/^https?:\/\//.test('http://www.bbc.co.uk/sport/cricket'); // true

/^https?:\/\//.test('ftp://www.bbc.co.uk/sport/cricket'); // false

1

这也适用于URL编码的字符串。

^(https?)(:\/\/|(\%3A%2F%2F))

-1

在 asp.net 中,将此设置为不区分大小写并不起作用,因此我只是指定了每个字母。

以下是我在 asp.net 的 RegularExpressionValidator 中所需执行的操作:

[Hh][Tt][Tt][Pp][Ss]?://(.*)

注意:

  • (?i)和使用/whatever/i都没有正常工作,可能是因为JavaScript还没有引入所有大小写敏感的功能。
  • 最初在开头有^,但这不重要,但(.*)却很重要(表达式没有(.*)无法工作,但没有^可以工作)
  • 不需要转义//,虽然这可能是个好主意。

如果需要,以下是完整的RegularExpressionValidator:

<asp:RegularExpressionValidator ID="revURLHeaderEdit" runat="server" 
    ControlToValidate="txtURLHeaderEdit" 
    ValidationExpression="[Hh][Tt][Tt][Pp][Ss]?://(.*)"
    ErrorMessage="URL should begin with http:// or https://" >
</asp:RegularExpressionValidator>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接