Regex per verificare se la stringa inizia con http: // o https: //


200

Sto cercando di impostare una regexp che controllerà l'inizio di una stringa e se contiene una http://o https://dovrebbe corrispondere.

Come lo posso fare? Sto provando quanto segue che non funziona:

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

5
Se stai controllando solo l'inizio della stringa, è probabilmente più veloce fare semplicemente un confronto diretto dei primi caratteri della stringa con i motivi che stai cercando.
templatetypedef

2
Stai creando un gruppo di personaggi con []. Sarà mach un personaggio che è o (, ), h, t, t, po s. Vale a dire corrisponderebbe s://ma non ht://o x://.
Felix Kling

2
@templatetypedef: penso di percepire una ottimizzazione prematura.
cdhowie,

4
Molte librerie moderne di espressioni regolari sono molto veloci . A meno che non ci siano (molti) back-tracking, le espressioni regolari possono confrontare favorevolmente - o meglio - approcci di stile "indice di" (confronta /^x/vs indexOf(x) == 0). Gli approcci di stile "inizia con" possono avere un sovraccarico minore, ma sospetto che raramente sia importante: scegli qual è il più pulito, che potrebbe benissimo essere: x.StartWith("http://") || x.StartsWith("https://")- ma fallo per chiarezza del codice, non un tentativo di migliorare le prestazioni se non giustificato con analisi e requisiti :-)

Risposte:


354

Il tuo uso di []non è corretto: nota che []indica una classe di caratteri e pertanto corrisponderà sempre e solo a un personaggio. L'espressione si [(http)(https)]traduce in "abbina a (, an h, a t, a t, a p, a )o an s." (I caratteri duplicati vengono ignorati.)

Prova questo:

^https?://

Se vuoi davvero usare l'alternanza, usa invece questa sintassi:

^(http|https)://

Come stringa di input PHP: $ regex = '/ ^ (https?: \ / \ /)';
Steve Tauber,

9
Steve, penso che ti sia perso un / alla fine: $ regex = '/ ^ (https?: \ / \ /) /';
Axi,

10
Nel caso in cui un po 'di noce imposti accidentalmente l'http, $ regex =' / ^ (https?: \ / \ /) / I ';
jeffkee,

3
Hai dimenticato di scappare / usando \. Così sarebbe ^https?:\/\/. Ho ragione?
Shafizadeh,

4
@Shafizadeh /non è un carattere speciale nelle espressioni regolari, solo nelle lingue in cui /viene utilizzato per annotare un'espressione regolare letterale. Ad esempio, non è necessario uscire dalle /espressioni regolari quando si usa C #, poiché le espressioni regolari C # sono espresse (in parte) come letterali stringa. Né ne hai bisogno in, diciamo, Perl (quando usi un delimitatore alternativo come in m#^https?://#). Quindi, per rispondere direttamente al tuo commento: (a) No, non ho dimenticato di scappare da nulla. (b) Dovrai sfuggire a qualunque personaggio sia trattato in modo speciale nella tua lingua preferita.
cdhowie,

43

Case insensitive:

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

25
^https?://

Tuttavia, potrebbe essere necessario sfuggire alle barre in avanti, a seconda del contesto.




0

Questo funzionerà anche per le stringhe con codifica URL.

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

0

Rendere questo case insensitive non funzionava in asp.net, quindi ho appena specificato ciascuna delle lettere.

Ecco cosa ho dovuto fare per farlo funzionare in un asp.net RegularExpressionValidator :

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

Appunti:

  • (?i)e l'utilizzo /whatever/iprobabilmente non ha funzionato perché JavaScript non ha portato tutte le funzionalità sensibili al maiuscolo / minuscolo
  • Inizialmente aveva ^all'inizio ma non importava, ma lo (.*)faceva (Expression non funzionava senza (.*)ma funzionava senza ^)
  • Non è necessario scappare dal //pensiero che potrebbe essere una buona idea.

Ecco il RegularExpressionValidator completo se ne hai bisogno:

<asp:RegularExpressionValidator ID="revURLHeaderEdit" runat="server" 
    ControlToValidate="txtURLHeaderEdit" 
    ValidationExpression="[Hh][Tt][Tt][Pp][Ss]?://(.*)"
    ErrorMessage="URL should begin with http:// or https://" >
</asp:RegularExpressionValidator>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.