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


200

我试图设置一个正则表达式,它将检查字符串的开头,以及是否包含其中一个http://https://应与之匹配。

我怎样才能做到这一点?我正在尝试以下不起作用的方法:

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

5
如果仅检查字符串的开头,则可以直接比较字符串的前几个字符与所需的模式,这样可能会更快。
templatetypedef

2
您正在创建一个字符组[]。它将马赫一个字符要么是()https。即它将匹配,s://但不匹配ht://x://
菲利克斯·克林

2
@templatetypedef:我认为我感觉有些过早的优化。
cdhowie 2011年

4
许多现代的正则表达式库都非常快。除非存在(大量)回溯,否则正则表达式可能会比“索引”样式方法(比较/^x/vs indexOf(x) == 0)更好地(甚至更好)。“从头开始”样式的方法可能会减少开销,但是我怀疑这几乎没有关系-选择最干净的东西,这很可能是:x.StartWith("http://") || x.StartsWith("https://")-但是这样做出于代码清晰,除非有以下理由,否则不要尝试提高性能分析和要求:-)

Answers:


353

您对的使用[]不正确-请注意,它[]表示一个字符类,因此只能匹配一个字符。该表达式[(http)(https)]翻译为“匹配a (,an h,a t,a t,a p,a )或an” s。(重复的字符将被忽略。)

试试这个:

^https?://

如果您确实要使用交替,请改用以下语法:

^(http|https)://

作为PHP输入字符串:$ regex ='/ ^(https?:\ / \ /)';
史蒂夫·陶伯

9
史蒂夫,我想您在末尾错过了/:$ regex ='/ ^(https?:\ / \ /)/';
Axi)

10
以防万一某个螺母意外地将http大写,$ regex ='/ ^(https?:\ / \ /)/ i';
jeffkee

3
您忘记使用\来转义。那就这样^https?:\/\/。我对吗?
Shafizadeh,2016年

4
@Shafizadeh /在正则表达式中不是特殊字符,仅在/用于表示文字正则表达式的语言中才是。例如,/使用C#时不必在正则表达式中转义,因为C#正则表达式(部分)表示为字符串文字。例如,在Perl中也不需要它们(当使用替代分隔符时,如m#^https?://#)。因此,请直接发表您的评论:(a)不,我没有忘记逃避任何事情。(b)您将需要转义以您选择的语言特别对待的任何字符。
cdhowie

43

不区分大小写:

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

25
^https?://

但是,根据上下文,您可能不得不转义正斜杠。





0

使这种大小写不区分大小写在asp.net中不起作用,因此我只指定了每个字母。

这是我必须做的才能使其在asp.net RegularExpressionValidator中工作

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

笔记:

  • (?i)并且使用/whatever/i不起作用可能是因为javascript并未引入所有区分大小写的功能
  • 最初是有^开始的,但是没关系,但是(.*)做到了(Expression没有工作,(.*)但是没有工作^
  • //虽然不需要逃避,但这可能是个好主意。

如果需要,这是完整的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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.