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:
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 =newRegExp("^(http|https)://","i");var str ="My String";var match = re.test(str);
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:RegularExpressionValidatorID="revURLHeaderEdit"runat="server"ControlToValidate="txtURLHeaderEdit"ValidationExpression="[Hh][Tt][Tt][Pp][Ss]?://(.*)"ErrorMessage="URL should begin with http:// or https://"></asp:RegularExpressionValidator>
[]
. Será mach un carácter que puede ser(
,)
,h
,t
,t
,p
os
. Es decir, coincidirías://
pero noht://
ox://
./^x/
vsindexOf(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:
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(
, anh
, at
, at
, ap
, a)
o ans
". (Los caracteres duplicados se ignoran).Prueba esto:
Si realmente quieres usar alternancia, usa esta sintaxis en su lugar:
fuente
^https?:\/\/
. Estoy en lo cierto?/
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 enm#^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.Caso insensible:
fuente
Sin embargo, es posible que deba escapar de las barras diagonales, según el contexto.
fuente
^https?:\/\/(.*)
donde(.*)
es coincidir con todo lo demás despuéshttps://
fuente
Esto debería funcionar
fuente
Esto también funcionará para cadenas codificadas con URL.
fuente
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 :
Notas:
(?i)
y el uso/whatever/i
no funcionó probablemente porque javascript no ha traído todas las funciones sensibles a mayúsculas y minúsculas^
al principio, pero no importaba, pero lo(.*)
hizo (Expression no funcionó sin,(.*)
pero funcionó sin^
)//
aunque podría ser una buena idea.Aquí está el RegularExpressionValidator completo si lo necesita:
fuente