223
votes

I'm trying to set a regexp which will check the start of a string, and if it contains either http:// or https:// it should match it.

How can I do that? I'm trying the following which isn't working:

^[(http)(https)]://
9
If you're checking just the start of the string, it's probably faster to just do a straight comparison of the first few characters of the string with the patterns you're looking for. - templatetypedef
You are creating a character group with []. It will mach one character that is either (,),h,t,t,p or s. I.e. it would match s:// but not ht:// or x://. - Felix Kling
@templatetypedef: I think I sense some premature optimization. - cdhowie
Many modern regular expression libraries are very fast. Unless there is (lots of) back-tracking, regular expressions may compare favorably -- or better -- to "index-of" style approaches (compare /^x/ vs indexOf(x) == 0). "starts with" style approaches may have less overhead, but I suspect it rarely matters -- choose what is the cleanest, which very well may be: x.StartWith("http://") || x.StartsWith("https://") -- but do so out of code clarity, not an attempt to improve performance unless justified with analysis and requirements :-) - user166390

9 Answers

398
votes

Your use of [] is incorrect -- note that [] denotes a character class and will therefore only ever match one character. The expression [(http)(https)] translates to "match a (, an h, a t, a t, a p, a ), or an s." (Duplicate characters are ignored.)

Try this:

^https?://

If you really want to use alternation, use this syntax instead:

^(http|https)://
48
votes

Case insensitive:

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

You might have to escape the forward slashes though, depending on context.

27
votes

^https?:\/\/(.*) where (.*) is match everything else after https://

15
votes

This should work

^(http|https)://
1
votes

^ for start of the string pattern,

? for allowing 0 or 1 time repeat. ie., s? s can exist 1 time or no need to exist at all.

/ is a special character in regex so it needs to be escaped by a backslash \/

/^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
0
votes

This will work for URL encoded strings too.

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

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

This works for me

Not a regex specialist, but i will try to explain the awnser.

(http|https) : Parenthesis indicates a capture group, "I" a OR statement.

\/\/ : "\" allows special characters, such as "/"

(\S+) : Anything that is not whitespace until the next whitespace

-1
votes

Making this case insensitive wasn't working in asp.net so I just specified each of the letters.

Here's what I had to do to get it working in an asp.net RegularExpressionValidator:

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

Notes:

  • (?i) and using /whatever/i didn't work probably because javascript hasn't brought in all case sensitive functionality
  • Originally had ^ at beginning but it didn't matter, but the (.*) did (Expression didn't work without (.*) but did work without ^)
  • Didn't need to escape the // though might be a good idea.

Here's the full RegularExpressionValidator if you need it:

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