Regex pour tester si la chaîne commence par http: // ou https: //

200

J'essaie de définir une expression rationnelle qui vérifiera le début d'une chaîne, et si elle contient l'une http://ou l' autre, https://elle doit correspondre.

Comment puis je faire ça? J'essaie ce qui suit qui ne fonctionne pas:

^[(http)(https)]://
Cliquez Upvote
la source
5
Si vous ne vérifiez que le début de la chaîne, il est probablement plus rapide de comparer simplement les premiers caractères de la chaîne avec les modèles que vous recherchez.
templatetypedef
2
Vous créez un groupe de personnages avec []. Il mach un caractère qui est soit (, ), h, t, t, pou s. C'est à dire qu'il correspondrait s://mais pas ht://ou x://.
Felix Kling
2
@templatetypedef: Je pense que je sens une optimisation prématurée.
cdhowie
4
De nombreuses bibliothèques d'expression régulière modernes sont très rapides . À moins qu'il n'y ait (beaucoup) de back-tracking, les expressions régulières peuvent se comparer favorablement - ou mieux - aux approches de style "index-of" (comparer /^x/vs indexOf(x) == 0). Les approches de style "commence par" peuvent avoir moins de frais généraux, mais je soupçonne que cela importe rarement - choisissez ce qui est le plus propre, ce qui peut très bien être: x.StartWith("http://") || x.StartsWith("https://")- mais faites-le par clarté du code, pas pour tenter d'améliorer les performances, sauf si cela est justifié par analyse et exigences :-)

Réponses:

354

Votre utilisation de []est incorrecte - notez que cela []dénote une classe de caractères et ne correspondra donc qu'à un seul caractère. L'expression se [(http)(https)]traduit par "correspondre à a (, an h, a t, a t, a p, a )ou an s". (Les caractères en double sont ignorés.)

Essaye ça:

^https?://

Si vous voulez vraiment utiliser l'alternance, utilisez plutôt cette syntaxe:

^(http|https)://
cdhowie
la source
En tant que chaîne d'entrée PHP: $ regex = '/ ^ (https?: \ / \ /)';
Steve Tauber
9
Steve, je pense que vous avez manqué un / à la fin: $ regex = '/ ^ (https?: \ / \ /) /';
Axi
10
Juste au cas où un écrou majuscule accidentellement le http, $ regex = '/ ^ (https?: \ / \ /) / I';
jeffkee
3
Vous avez oublié de vous échapper / d'utiliser \. Il en serait ainsi ^https?:\/\/. Ai-je raison?
Shafizadeh du
4
@Shafizadeh /n'est pas un caractère spécial dans les expressions régulières, uniquement dans les langues où /est utilisé pour noter une expression régulière littérale. Par exemple, il n'est pas nécessaire de s'échapper /dans les expressions régulières lorsque vous utilisez C #, car les expressions régulières C # sont exprimées (en partie) sous forme de littéraux de chaîne. Vous n'avez pas non plus besoin d'eux dans, disons, Perl (lorsque vous utilisez un délimiteur alternatif comme dans m#^https?://#). Donc, pour répondre directement à votre commentaire: (a) Non, je n'ai pas oublié d'échapper à quoi que ce soit. (b) Vous devrez échapper aux personnages traités spécialement dans la langue de votre choix.
cdhowie
43

Insensible à la casse:

var re = new RegExp("^(http|https)://", "i");
var str = "My String";
var match = re.test(str);
mésaventure
la source
25
^https?://

Vous devrez peut-être échapper aux barres obliques, selon le contexte.

orlp
la source
20

^https?:\/\/(.*)(.*)correspond tout le reste aprèshttps://

Serhii Aksiutin
la source
15

Cela devrait fonctionner

^(http|https)://
Tasawer Khan
la source
0

Cela fonctionnera également pour les chaînes codées par URL.

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

Rendre ce cas insensible ne fonctionnait pas dans asp.net donc je viens de spécifier chacune des lettres.

Voici ce que je devais faire pour le faire fonctionner dans un asp.net RegularExpressionValidator :

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

Remarques:

  • (?i)et l'utilisation /whatever/in'a pas fonctionné probablement parce que javascript n'a pas apporté toutes les fonctionnalités sensibles à la casse
  • A l'origine, ^au début, mais cela n'avait pas d'importance, mais le (.*)faisait (l'expression ne fonctionnait pas sans (.*)mais fonctionnait sans ^)
  • Je n'avais pas besoin de m'échapper //mais cela pourrait être une bonne idée.

Voici le RegularExpressionValidator complet si vous en avez besoin:

<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.
la source