Regex para probar si la cadena comienza con http: // o https: //


200

Estoy tratando de establecer una expresión regular que verificará el inicio de una cadena, y si contiene una http://o https://debería coincidir.

¿Cómo puedo hacer eso? Estoy intentando lo siguiente que no funciona:

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

55
Si está comprobando solo el comienzo de la cadena, probablemente sea más rápido hacer una comparación directa de los primeros caracteres de la cadena con los patrones que está buscando.
templatetypedef

2
Estás creando un grupo de personajes con []. Será mach un carácter que puede ser (, ), h, t, t, po s. Es decir, coincidiría s://pero no ht://o x://.
Felix Kling

2
@templatetypedef: Creo que siento una optimización prematura.
cdhowie

44
Muchas bibliotecas modernas de expresiones regulares son muy rápidas . A menos que haya (un montón de) seguimiento hacia atrás, las expresiones regulares pueden compararse favorablemente, o mejor, con los enfoques de estilo de "índice de" (comparar /^x/vs indexOf(x) == 0). "comienza con" estilo enfoques pueden tener menos gastos generales, pero sospecho que rara vez se importa - elegir lo que es el más limpio, que muy bien puede ser: x.StartWith("http://") || x.StartsWith("https://")- pero lo hacen fuera de la claridad del código, no un intento de mejorar el rendimiento con menos que se justifique análisis y requisitos :-)

Respuestas:


354

Su uso de []es incorrecto: tenga en cuenta que []denota una clase de caracteres y, por lo tanto, solo coincidirá con un carácter. La expresión se [(http)(https)]traduce como "coincidir con a (, an h, a t, a t, a p, a )o an s". (Los caracteres duplicados se ignoran).

Prueba esto:

^https?://

Si realmente quieres usar alternancia, usa esta sintaxis en su lugar:

^(http|https)://

Como una cadena de entrada PHP: $ regex = '/ ^ (https?: \ / \ /)';
Steve Tauber

9
Steve, creo que te perdiste un / al final: $ regex = '/ ^ (https?: \ / \ /) /';
Axi

10
En caso de que alguna tuerca ponga en mayúscula accidentalmente el http, $ regex = '/ ^ (https?: \ / \ /) / I';
jeffkee

3
Olvidaste escapar / usar \. Así sería ^https?:\/\/. Estoy en lo cierto?
Shafizadeh

44
@Shafizadeh /no es un carácter especial en las expresiones regulares, solo en los idiomas donde /se usa para anotar una expresión regular literal. Por ejemplo, no es necesario escapar /en expresiones regulares cuando se usa C #, porque las expresiones regulares de C # se expresan (en parte) como literales de cadena. Tampoco los necesita en, digamos, Perl (cuando usa un delimitador alternativo como en m#^https?://#). Entonces, para abordar directamente su comentario: (a) No, no olvidé escapar de nada. (b) Tendrá que escapar de cualquier personaje que sea tratado especialmente en el idioma que elija.
cdhowie

43

Caso insensible:

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

25
^https?://

Sin embargo, es posible que deba escapar de las barras diagonales, según el contexto.




0

Esto también funcionará para cadenas codificadas con URL.

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

0

Hacer que este caso fuera insensible no funcionaba en asp.net, así que solo especifiqué cada una de las letras.

Esto es lo que tuve que hacer para que funcione en un asp.net RegularExpressionValidator :

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

Notas:

  • (?i)y el uso /whatever/ino funcionó probablemente porque javascript no ha traído todas las funciones sensibles a mayúsculas y minúsculas
  • Originalmente tenía ^al principio, pero no importaba, pero lo (.*)hizo (Expression no funcionó sin, (.*)pero funcionó sin ^)
  • No necesitaba escapar, //aunque podría ser una buena idea.

Aquí está el RegularExpressionValidator completo si lo necesita:

<asp:RegularExpressionValidator ID="revURLHeaderEdit" runat="server" 
    ControlToValidate="txtURLHeaderEdit" 
    ValidationExpression="[Hh][Tt][Tt][Pp][Ss]?://(.*)"
    ErrorMessage="URL should begin with http:// or https://" >
</asp:RegularExpressionValidator>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.