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:
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 =newRegExp("^(http|https)://","i");var str ="My String";var match = re.test(str);
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:RegularExpressionValidatorID="revURLHeaderEdit"runat="server"ControlToValidate="txtURLHeaderEdit"ValidationExpression="[Hh][Tt][Tt][Pp][Ss]?://(.*)"ErrorMessage="URL should begin with http:// or https://"></asp:RegularExpressionValidator>
[]
. Będzie ona macha jeden znak, który jest albo(
,)
,h
,t
,t
,p
lubs
. Czyli pasowałoby,s://
ale nieht://
lubx://
./^x/
vsindexOf(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:
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(
Anh
, At
, At
, Ap
, A)
, albos
". (Zduplikowane znaki są ignorowane).Spróbuj tego:
Jeśli naprawdę chcesz użyć alternacji, użyj tej składni:
źródło
^https?:\/\/
. Czy mam rację?/
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 wm#^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.Bez względu na wielkość liter:
źródło
Być może trzeba będzie uciec przed ukośnikami, w zależności od kontekstu.
źródło
^https?:\/\/(.*)
gdzie(.*)
pasuje wszystko inne pohttps://
źródło
To powinno działać
źródło
Działa to również w przypadku ciągów zakodowanych w adresie URL.
źródło
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 :
Uwagi:
(?i)
i używanie/whatever/i
nie działało prawdopodobnie dlatego, że javascript nie przyniósł wszystkich funkcji rozróżniania wielkości liter^
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^
)//
choć może to być dobry pomysł.Oto pełny RegularExpressionValidator, jeśli go potrzebujesz:
źródło