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)]://
Klicken Sie auf Upvote
quelle
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)://
cdhowie
quelle
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);
Missgeschick
quelle
25
^https?://

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

orlp
quelle
20

^https?:\/\/(.*)Wo (.*)ist Match alles andere danachhttps://

Serhii Aksiutin
quelle
15

Das sollte funktionieren

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

Dies funktioniert auch für URL-codierte Zeichenfolgen.

^(https?)(:\/\/|(\%3A%2F%2F))
Saravanan
quelle
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>
Tony L.
quelle