Regex para testar se a sequência começa com http: // ou https: //

200

Estou tentando definir um regexp que irá verificar o início de uma seqüência de caracteres e se ele contém um http://ou https://deve corresponder a ele.

Como eu posso fazer isso? Estou tentando o seguinte que não está funcionando:

^[(http)(https)]://
Click Voto a favor
fonte
5
Se você estiver verificando apenas o início da sequência, provavelmente será mais rápido fazer uma comparação direta dos primeiros caracteres da sequência com os padrões que você está procurando.
templatetypedef
2
Você está criando um grupo de caracteres com []. Ele vai mach um personagem que é ou (, ), h, t, t, pou s. Ou seja, seria compatível, s://mas não ht://ou x://.
Felix Kling
2
@templatetypedef: Acho que sinto uma otimização prematura.
precisa saber é o seguinte
4
Muitas bibliotecas modernas de expressão regular são muito rápidas . A menos que haja (muito) rastreamento de retorno, as expressões regulares podem ser comparadas favoravelmente - ou melhor - às abordagens de estilo de "índice de" (compare /^x/vs indexOf(x) == 0). As abordagens de estilo "começa com" podem ter menos sobrecarga, mas suspeito que isso raramente importa - escolha o que é mais limpo, o que pode ser muito bom: x.StartWith("http://") || x.StartsWith("https://")- mas faça isso com clareza de código, não com uma tentativa de melhorar o desempenho, a menos que justificado com análise e requisitos :-)

Respostas:

354

Seu uso de []está incorreto - observe que []denota uma classe de personagem e, portanto, sempre corresponderá apenas a um personagem. A expressão se [(http)(https)]traduz em "corresponder a (, um h, a t, a t, a p, a )ou a s". (Caracteres duplicados são ignorados.)

Tente o seguinte:

^https?://

Se você realmente deseja usar alternância, use esta sintaxe:

^(http|https)://
cdhowie
fonte
Como uma string de entrada do PHP: $ regex = '/ ^ (https?: \ / \ /)';
9118 Steve Tauber
9
Steve, acho que você perdeu um / no final: $ regex = '/ ^ (https?: \ / \ /) /';
Axi
10
Apenas no caso de alguma porca colocar acidentalmente maiúsculas no http, $ regex = '/ ^ (https?: \ / \ /) / I';
jeffkee
3
Você esqueceu de escapar / usar \. Assim seria ^https?:\/\/. Estou certo?
Shafizadeh 22/01
4
@Shafizadeh /não é um caractere especial em expressões regulares, apenas em idiomas onde /é usado para notar uma expressão regular literal. Por exemplo, não é necessário escapar /em expressões regulares ao usar C #, porque expressões regulares em C # são expressas (em parte) como literais de cadeia de caracteres. Nem você precisa deles, digamos, em Perl (ao usar um delimitador alternativo como em m#^https?://#). Então, para abordar diretamente seu comentário: (a) Não, não esqueci de escapar de nada. (b) Você precisará escapar dos caracteres tratados especialmente no seu idioma de escolha.
Cdhowie
43

Não diferencia maiúsculas de minúsculas:

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

Você pode ter que escapar das barras, dependendo do contexto.

orlp
fonte
20

^https?:\/\/(.*)onde (.*)é combinar tudo o resto depoishttps://

Serhii Aksiutin
fonte
15

Isso deve funcionar

^(http|https)://
Tasawer Khan
fonte
0

Isso funcionará também para strings codificadas em URL.

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

Como esse caso não era sensível, não estava funcionando no asp.net, então apenas especifiquei cada uma das letras.

Aqui está o que eu fiz para fazê-lo funcionar em um asp.net RegularExpressionValidator :

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

Notas:

  • (?i)e o uso /whatever/inão funcionou provavelmente porque o javascript não trouxe todas as funcionalidades que diferenciam maiúsculas de minúsculas
  • Originalmente tinha ^no começo, mas não importava, mas (.*)funcionou (Expressão não funcionou sem, (.*)mas funcionou sem ^)
  • Não precisava escapar do //que poderia ser uma boa ideia.

Aqui está o RegularExpressionValidator completo, se você precisar:

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