Dizenin http: // veya https: // ile başlayıp başlamadığını test etmek için normal ifade


200

Ben bir dize başlangıcını kontrol edecek bir regexp ayarlamaya çalışıyorum, ya http://da içeriyorsa ya da https://eşleşmelidir.

Bunu nasıl yapabilirim? Ben çalışmıyor olan aşağıdaki çalışıyorum:

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

5
Dizenin sadece başlangıcını kontrol ediyorsanız, dizenin ilk birkaç karakterini aradığınız desenlerle doğrudan karşılaştırmak daha hızlıdır.
templatetypedef

2
İle bir karakter grubu oluşturuyorsunuz []. Bu mach olacak biri ya olduğu karakteri (, ), h, t, t, pveya s. Yani eşleşir s://ama eşleşmez ht://ya da x://.
Felix Kling

2
@templatetypedef: Sanırım erken bir optimizasyon hissediyorum.
cdhowie

4
Birçok modern düzenli ifade kütüphanesi çok hızlıdır . Ya da daha iyi - - (sürü) geri izleme olmadığı sürece, normal ifadeler olumlu karşılaştırabilir tarzı yaklaşımlar "index-of" (karşılaştırma /^x/vs indexOf(x) == 0). "ile başlar" tarzı yaklaşımlar daha az yük olabilir, ama nadiren önemli olduğundan şüpheleniyorum - en temiz olanı seçin, ki bu çok iyi olabilir: x.StartWith("http://") || x.StartsWith("https://")- ama kod netliği dışında, haklı olmadığı sürece performansı artırmak için bir girişimde bulunmayın analiz ve gereksinimleri :-)

Yanıtlar:


354

Kullanımınız []yanlış - []bir karakter sınıfını belirtir ve bu nedenle yalnızca bir karakterle eşleşir. İfadesi [(http)(https)]"bir maç için çevirir (, bir h, bir t, bir t, bir p, bir )ya da bir s." (Yinelenen karakterler yok sayılır.)

Bunu dene:

^https?://

Gerçekten alternatif kullanmak istiyorsanız, bu sözdizimini kullanın:

^(http|https)://

PHP giriş dizesi olarak: $ regex = '/ ^ (https?: \ / \ /)';
Steve Tauber

9
Steve, sanırım sonunda bir / cevapsızsın: $ regex = '/ ^ (https?: \ / \ /) /';
Axi

10
Bazı somunların yanlışlıkla http, $ regex = '/ ^ (https?: \ / \ /) / İ';
jeffkee

3
\ Kullanarak kaçmayı / kullanmayı unuttun. Öyleyse olurdu ^https?:\/\/. Haklı mıyım?
Shafizadeh

4
@Shafizadeh /normal ifadelerde özel bir karakter değildir, sadece /gerçek bir düzenli ifadeyi not etmek için kullanılan dillerde . Örneğin, /C # kullanırken normal ifadelerde kaçmak gerekli değildir , çünkü C # normal ifadeleri (kısmen) dize değişmezleri olarak ifade edilir. Bunlara, örneğin Perl'e (içinde olduğu gibi alternatif bir sınırlayıcı kullanırken m#^https?://#) da ihtiyacınız yoktur. Yorumunuzu doğrudan ele almak için: (a) Hayır, hiçbir şeyden kaçmayı unutmadım. (b) Seçtiğiniz dil için özel olarak ele alınan karakterlerden kaçmanız gerekir.
cdhowie

44

Büyük / küçük harfe duyarlı değil:

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

25
^https?://

Bağlama bağlı olarak, eğik çizgilerden kaçmanız gerekebilir.




0

Bu, URL kodlamalı dizelerde de çalışır.

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

0

Bu davayı duyarsız hale getirmek asp.net'te işe yaramadı, bu yüzden sadece harflerin her birini belirttim.

İşte bir asp.net RegularExpressionValidator içinde çalışmak için ne yapmak zorunda kaldı :

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

Notlar:

  • (?i) ve kullanarak /whatever/ijavascript her durumda hassas işlevsellik getirmediği için muhtemelen işe yaramadı
  • Başlangıçta vardı ^ama önemli değildi, ama (.*)yaptı (İfade olmadan işe yaramadı (.*)ama olmadan çalıştı ^)
  • //Olsa kaçmak gerek yoktu ama iyi bir fikir olabilir.

İhtiyacınız varsa tam RegularExpressionValidator:

<asp:RegularExpressionValidator ID="revURLHeaderEdit" runat="server" 
    ControlToValidate="txtURLHeaderEdit" 
    ValidationExpression="[Hh][Tt][Tt][Pp][Ss]?://(.*)"
    ErrorMessage="URL should begin with http:// or https://" >
</asp:RegularExpressionValidator>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.