Regex, um zu testen, ob die Zeichenfolge mit http: // oder https: // beginnt


200

Ich versuche, einen regulären Ausdruck festzulegen, der den Anfang eines Strings überprüft und ob er einen enthält http://oder mit https://ihm übereinstimmen sollte.

Wie kann ich das machen? Ich versuche Folgendes, was nicht funktioniert:

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

5
Wenn Sie nur den Anfang der Zeichenfolge überprüfen, ist es wahrscheinlich schneller, die ersten Zeichen der Zeichenfolge direkt mit den gesuchten Mustern zu vergleichen.
Templatetypedef

2
Sie erstellen eine Charaktergruppe mit []. Es macht ein Zeichen , das entweder (, ), h, t, t, poder s. Dh es würde s://aber nicht passen ht://oder x://.
Felix Kling

2
@templatetypedef: Ich glaube, ich spüre eine vorzeitige Optimierung.
CDhowie

4
Viele moderne Bibliotheken für reguläre Ausdrücke sind sehr schnell . Sofern es nicht (viel) Back-Tracking gibt, können reguläre Ausdrücke günstig oder besser mit "Index-of" -Stilansätzen verglichen werden (vergleiche /^x/vs indexOf(x) == 0). Ansätze, die mit "beginnen mit" beginnen, haben möglicherweise weniger Aufwand, aber ich vermute, dass dies selten von Bedeutung ist. Wählen Sie die sauberste aus, was sehr gut sein kann: x.StartWith("http://") || x.StartsWith("https://")- Aus Gründen der Codeklarheit und nicht aus Gründen der Leistungsverbesserung, es sei denn, dies ist gerechtfertigt Analyse und Anforderungen :-)

Antworten:


352

Ihre Verwendung von []ist falsch - beachten Sie, dass dies []eine Zeichenklasse bezeichnet und daher immer nur einem Zeichen entspricht. Der Ausdruck [(http)(https)]bedeutet "Übereinstimmung mit a (, an h, a t, a t, a p, a )oder an s". (Doppelte Zeichen werden ignoriert.)

Versuche dies:

^https?://

Wenn Sie wirklich Alternation verwenden möchten, verwenden Sie stattdessen diese Syntax:

^(http|https)://

Als PHP-Eingabezeichenfolge: $ regex = '/ ^ (https ?: \ / \ /)';
Steve Tauber

9
Steve, ich denke du hast ein / am Ende verpasst: $ regex = '/ ^ (https ?: \ / \ /) /';
Axi

10
Nur für den Fall, dass eine Nuss versehentlich das http, $ regex = '/ ^ (https ?: \ / \ /) / I' in Großbuchstaben schreibt;
Jeffrey

3
Du hast vergessen zu fliehen / mit \. So wäre es ^https?:\/\/. Habe ich recht?
Shafizadeh

4
@Shafizadeh /ist kein Sonderzeichen in regulären Ausdrücken, sondern nur in Sprachen, in denen /ein wörtlicher regulärer Ausdruck notiert wird . Beispielsweise ist es /bei Verwendung von C # nicht erforderlich, in regulären Ausdrücken zu maskieren, da reguläre C # -Ausdrücke (teilweise) als Zeichenfolgenliterale ausgedrückt werden. Sie benötigen sie beispielsweise nicht in Perl (wenn Sie ein alternatives Trennzeichen wie in verwenden m#^https?://#). Um Ihren Kommentar direkt anzusprechen: (a) Nein, ich habe nicht vergessen, irgendetwas zu entkommen. (b) Sie müssen sich den Zeichen entziehen, die speziell in der Sprache Ihrer Wahl behandelt werden.
CDhowie

43

Groß- und Kleinschreibung wird nicht berücksichtigt:

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

25
^https?://

Je nach Kontext müssen Sie sich möglicherweise den Schrägstrichen entziehen.




0

Dies funktioniert auch für URL-codierte Zeichenfolgen.

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

0

Es hat in asp.net nicht funktioniert, diesen Fall unempfindlich zu machen, daher habe ich nur jeden Buchstaben angegeben.

Folgendes musste ich tun, damit es in einem asp.net RegularExpressionValidator funktioniert :

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

Anmerkungen:

  • (?i)und die Verwendung /whatever/ihat wahrscheinlich nicht funktioniert, weil Javascript nicht alle Funktionen berücksichtigt, bei denen zwischen Groß- und Kleinschreibung unterschieden wird
  • Ursprünglich hatte ^am Anfang aber es war egal, aber das (.*)tat (Ausdruck funktionierte nicht ohne (.*), aber funktionierte ohne ^)
  • Ich musste nicht entkommen, aber das //könnte eine gute Idee sein.

Hier ist der vollständige RegularExpressionValidator, falls Sie ihn benötigen:

<asp:RegularExpressionValidator ID="revURLHeaderEdit" runat="server" 
    ControlToValidate="txtURLHeaderEdit" 
    ValidationExpression="[Hh][Tt][Tt][Pp][Ss]?://(.*)"
    ErrorMessage="URL should begin with http:// or https://" >
</asp:RegularExpressionValidator>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.