Jika Anda memeriksa awal string, mungkin lebih cepat melakukan perbandingan langsung dari beberapa karakter pertama string dengan pola yang Anda cari.
templatetypedef
2
Anda membuat grup karakter dengan []. Ini akan mach satu karakter yang baik (, ), h, t, t, patau s. Yaitu itu akan cocok s://tetapi tidak ht://atau x://.
Felix Kling
2
@ templatetypedef: Saya rasa saya merasakan beberapa optimasi prematur.
cdhowie
4
Banyak perpustakaan ekspresi reguler modern sangat cepat . Kecuali jika ada (banyak) pelacakan balik, ekspresi reguler dapat dibandingkan dengan baik - atau lebih baik - dengan pendekatan gaya "indeks" (bandingkan /^x/vs indexOf(x) == 0). "dimulai dengan" pendekatan gaya mungkin memiliki overhead yang lebih sedikit, tetapi saya menduga itu jarang penting - pilih apa yang paling bersih, yang mungkin sangat baik: x.StartWith("http://") || x.StartsWith("https://")- tetapi melakukannya di luar kejelasan kode, bukan upaya untuk meningkatkan kinerja kecuali dibenarkan dengan analisis dan persyaratan :-)
Jawaban:
354
Penggunaan Anda []salah - catatan yang []menunjukkan kelas karakter dan karenanya hanya akan cocok dengan satu karakter. Ekspresi [(http)(https)]diterjemahkan menjadi "cocok dengan a (, an h, a t, a t, a p, a ), atau a s." (Karakter duplikat diabaikan.)
Coba ini:
^https?://
Jika Anda benar-benar ingin menggunakan pergantian, gunakan sintaks ini sebagai gantinya:
Steve, saya pikir Anda melewatkan / pada akhirnya: $ regex = '/ ^ (https?: \ / \ /) /';
Axi
10
Untuk berjaga-jaga kalau-kalau beberapa kacang secara tidak sengaja membuat http, $ regex = '/ ^ (https?: \ / \ /) / I';
jeffkee
3
Anda lupa melarikan diri / menggunakan \. Jadi itu akan terjadi ^https?:\/\/. Apakah saya benar?
Shafizadeh
4
@Shafizadeh /bukan karakter khusus dalam ekspresi reguler, hanya dalam bahasa /yang digunakan untuk memberi tahu ekspresi reguler literal. Misalnya, tidak perlu melarikan diri /dalam ekspresi reguler saat menggunakan C #, karena ekspresi reguler C # diekspresikan (sebagian) sebagai string literal. Anda juga tidak memerlukannya di, misalnya, Perl (saat menggunakan pembatas alternatif seperti pada m#^https?://#). Jadi untuk langsung menanggapi komentar Anda: (a) Tidak, saya tidak lupa untuk melarikan diri apa pun. (B) Anda harus melarikan diri karakter apa pun yang diperlakukan khusus dalam bahasa pilihan Anda.
cdhowie
43
Tidak sensitif huruf:
var re =newRegExp("^(http|https)://","i");var str ="My String";var match = re.test(str);
Membuat case ini tidak sensitif tidak berfungsi di asp.net jadi saya hanya menentukan masing-masing surat.
Inilah yang harus saya lakukan untuk membuatnya bekerja di asp.net RegularExpressionValidator :
[Hh][Tt][Tt][Pp][Ss]?://(.*)
Catatan:
(?i) dan menggunakan /whatever/i tidak berfungsi mungkin karena javascript tidak membawa semua fungsi case sensitif
Awalnya sudah ^di awal tetapi tidak masalah, tapi (.*)itu (Ekspresi tidak bekerja tanpa (.*)tetapi tidak bekerja tanpa ^)
Tidak perlu melarikan diri, //mungkin itu ide yang bagus.
Ini adalah RegularExpressionValidator lengkap jika Anda membutuhkannya:
<asp:RegularExpressionValidatorID="revURLHeaderEdit"runat="server"ControlToValidate="txtURLHeaderEdit"ValidationExpression="[Hh][Tt][Tt][Pp][Ss]?://(.*)"ErrorMessage="URL should begin with http:// or https://"></asp:RegularExpressionValidator>
[]
. Ini akan mach satu karakter yang baik(
,)
,h
,t
,t
,p
ataus
. Yaitu itu akan cocoks://
tetapi tidakht://
ataux://
./^x/
vsindexOf(x) == 0
). "dimulai dengan" pendekatan gaya mungkin memiliki overhead yang lebih sedikit, tetapi saya menduga itu jarang penting - pilih apa yang paling bersih, yang mungkin sangat baik:x.StartWith("http://") || x.StartsWith("https://")
- tetapi melakukannya di luar kejelasan kode, bukan upaya untuk meningkatkan kinerja kecuali dibenarkan dengan analisis dan persyaratan :-)Jawaban:
Penggunaan Anda
[]
salah - catatan yang[]
menunjukkan kelas karakter dan karenanya hanya akan cocok dengan satu karakter. Ekspresi[(http)(https)]
diterjemahkan menjadi "cocok dengan a(
, anh
, at
, at
, ap
, a)
, atau as
." (Karakter duplikat diabaikan.)Coba ini:
Jika Anda benar-benar ingin menggunakan pergantian, gunakan sintaks ini sebagai gantinya:
sumber
^https?:\/\/
. Apakah saya benar?/
bukan karakter khusus dalam ekspresi reguler, hanya dalam bahasa/
yang digunakan untuk memberi tahu ekspresi reguler literal. Misalnya, tidak perlu melarikan diri/
dalam ekspresi reguler saat menggunakan C #, karena ekspresi reguler C # diekspresikan (sebagian) sebagai string literal. Anda juga tidak memerlukannya di, misalnya, Perl (saat menggunakan pembatas alternatif seperti padam#^https?://#
). Jadi untuk langsung menanggapi komentar Anda: (a) Tidak, saya tidak lupa untuk melarikan diri apa pun. (B) Anda harus melarikan diri karakter apa pun yang diperlakukan khusus dalam bahasa pilihan Anda.Tidak sensitif huruf:
sumber
Anda mungkin harus melarikan diri dari garis miring ke depan, tergantung pada konteksnya.
sumber
^https?:\/\/(.*)
di mana(.*)
cocok dengan yang lainnya setelahhttps://
sumber
Ini seharusnya bekerja
sumber
Ini juga akan berfungsi untuk string yang disandikan URL.
sumber
Membuat case ini tidak sensitif tidak berfungsi di asp.net jadi saya hanya menentukan masing-masing surat.
Inilah yang harus saya lakukan untuk membuatnya bekerja di asp.net RegularExpressionValidator :
Catatan:
(?i)
dan menggunakan/whatever/i
tidak berfungsi mungkin karena javascript tidak membawa semua fungsi case sensitif^
di awal tetapi tidak masalah, tapi(.*)
itu (Ekspresi tidak bekerja tanpa(.*)
tetapi tidak bekerja tanpa^
)//
mungkin itu ide yang bagus.Ini adalah RegularExpressionValidator lengkap jika Anda membutuhkannya:
sumber