Ponownie sprawdź, czy ciąg zaczyna się od http: // lub https: //

200

Próbuję ustawić wyrażenia regularnego, które będą sprawdzać początek napisu, a jeżeli zawiera on albo http://czy https://należy ją dopasować.

Jak mogę to zrobić? Próbuję następujących, które nie działają:

^[(http)(https)]://
Kliknij opcję Upvote
źródło
5
Jeśli sprawdzasz tylko początek ciągu, prawdopodobnie szybciej jest po prostu porównać pierwsze kilka znaków ciągu z wzorami, których szukasz.
templatetypedef
2
Tworzysz grupę postaci za pomocą []. Będzie ona macha jeden znak, który jest albo (, ), h, t, t, plub s. Czyli pasowałoby, s://ale nie ht://lub x://.
Felix Kling
2
@templatetypedef: Myślę, że wyczuwam przedwczesną optymalizację.
cdhowie 10.01.11
4
Wiele współczesnych bibliotek wyrażeń regularnych jest bardzo szybkich . O ile nie ma (wielu) śledzenia wstecznego, wyrażenia regularne mogą porównywać się pozytywnie - lub lepiej - do podejść w stylu „indeksu” (porównaj /^x/vs indexOf(x) == 0). „zaczyna się od” styl podejścia mogą mieć mniej nad głową, ale podejrzewam, że rzadko się liczy - wybierz to, co najczystsze, który bardzo dobrze może być: x.StartWith("http://") || x.StartsWith("https://")- ale zrobić z kodem jasności, nie próba poprawy wydajności, chyba że uzasadnione analiza i wymagania :-)

Odpowiedzi:

353

Twoje użycie []jest nieprawidłowe - pamiętaj, że []oznacza klasę postaci i dlatego zawsze będzie pasować tylko do jednej postaci. Wyrażenie [(http)(https)]przekłada się na "dopasowywania (An h, A t, A t, A p, A ), albo s". (Zduplikowane znaki są ignorowane).

Spróbuj tego:

^https?://

Jeśli naprawdę chcesz użyć alternacji, użyj tej składni:

^(http|https)://
cdhowie
źródło
Jako ciąg wejściowy PHP: $ regex = '/ ^ (https?: \ / \ /)';
Steve Tauber
9
Steve, myślę, że przegapiłeś / na końcu: $ regex = '/ ^ (https?: \ / \ /) /';
Axi
10
Na wszelki wypadek niektóre orzechy przypadkowo wpisują wielkie litery http, $ regex = '/ ^ (https?: \ / \ /) / I';
jeffkee
3
Zapomniałeś uciec / użyć \. Tak by było ^https?:\/\/. Czy mam rację?
Shafizadeh
4
@Shafizadeh /nie jest znakiem specjalnym w wyrażeniach regularnych, tylko w językach, w których /używa się notacji dosłownego wyrażenia regularnego. Na przykład nie jest konieczne ucieczka /w wyrażeniach regularnych przy użyciu C #, ponieważ wyrażenia regularne C # są wyrażone (częściowo) jako literały łańcuchowe. Nie potrzebujesz ich też, powiedzmy, w Perlu (jeśli używasz alternatywnego separatora jak w m#^https?://#). Aby bezpośrednio odnieść się do komentarza: (a) Nie, nie zapomniałem niczego uciec. (b) Będziesz musiał uciec od znaków traktowanych specjalnie w wybranym języku.
cdhowie
43

Bez względu na wielkość liter:

var re = new RegExp("^(http|https)://", "i");
var str = "My String";
var match = re.test(str);
nieszczęście
źródło
25
^https?://

Być może trzeba będzie uciec przed ukośnikami, w zależności od kontekstu.

orlp
źródło
20

^https?:\/\/(.*)gdzie (.*)pasuje wszystko inne pohttps://

Serhii Aksiutin
źródło
15

To powinno działać

^(http|https)://
Tasawer Khan
źródło
0

Działa to również w przypadku ciągów zakodowanych w adresie URL.

^(https?)(:\/\/|(\%3A%2F%2F))
Saravanan
źródło
0

Uczynienie tego bez rozróżniania wielkości liter nie działało w asp.net, więc właśnie podałem każdą z liter.

Oto, co musiałem zrobić, aby działał w asp.net RegularExpressionValidator :

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

Uwagi:

  • (?i)i używanie /whatever/inie działało prawdopodobnie dlatego, że javascript nie przyniósł wszystkich funkcji rozróżniania wielkości liter
  • Początkowo miał ^na początku, ale to nie miało znaczenia, ale (.*)zadziałało (Wyrażenie nie działało bez, (.*)ale działało bez ^)
  • Nie musiałem uciekać, //choć może to być dobry pomysł.

Oto pełny RegularExpressionValidator, jeśli go potrzebujesz:

<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.
źródło