Bagaimana saya bisa memeriksa apakah string diakhiri dengan karakter tertentu dalam JavaScript?
Contoh: Saya punya string
var str = "mystring#";
Saya ingin tahu apakah string itu diakhiri dengan #
. Bagaimana saya bisa memeriksanya?
Apakah ada
endsWith()
metode dalam JavaScript?Salah satu solusi yang saya miliki adalah mengambil panjang string dan mendapatkan karakter terakhir dan memeriksanya.
Apakah ini cara terbaik atau ada cara lain?
javascript
string
ends-with
Bobby Kumar
sumber
sumber
String.prototype.endsWith
.Jawaban:
UPDATE (24 Nov 2015):
Jawaban ini awalnya diposting pada tahun 2010 (ENAM tahun yang lalu.) Jadi harap perhatikan komentar yang berwawasan luas ini:
Shauna - Pembaruan untuk Googler - Sepertinya ECMA6 menambahkan fungsi ini. Artikel MDN juga menunjukkan polyfill. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
TJ Crowder - Membuat substring tidak mahal pada browser modern; mungkin pada tahun 2010 ketika jawaban ini diposting. Saat ini,
this.substr(-suffix.length) === suffix
pendekatan sederhana tercepat di Chrome, sama di IE11 dengan indexOf, dan hanya 4% lebih lambat (wilayah fergetaboutit) di Firefox: jsperf.com/endswith-stackoverflow/14 Dan lebih cepat di papan ketika hasilnya salah: jsperf.com/endswith-stackoverflow-when-false Tentu saja, dengan menambahkan ES6 berakhir Dengan, intinya adalah diperdebatkan. :-)JAWABAN ASLI:
Saya tahu ini adalah pertanyaan berumur satu tahun ... tapi saya perlu ini juga dan saya membutuhkannya untuk bekerja lintas-browser jadi ... menggabungkan jawaban dan komentar semua orang dan sedikit menyederhanakannya:
indexOf
fungsi asli untuk hasil tercepatindexOf
untuk melompat ke depanJuga, jika Anda tidak suka memasukkan hal-hal dalam prototipe struktur data asli, berikut ini adalah versi mandiri:
EDIT: Seperti dicatat oleh @hamish di komentar, jika Anda ingin berbuat salah di sisi aman dan memeriksa apakah suatu implementasi telah disediakan, Anda bisa menambahkan
typeof
cek seperti:sumber
this.substr(-suffix.length) === suffix
pendekatan sederhana tercepat di Chrome, sama pada IE11indexOf
, dan hanya 4% lebih lambat (wilayah fergetaboutit) di Firefox: jsperf.com/endswith-stackoverflow/14 Dan lebih cepat di papan ketika hasilnya salah: jsperf .com / endswith-stackoverflow-when-false Tentu saja, dengan menambahkan ES6endsWith
, intinya adalah moot. :-)akan bekerja pada semua browser, tidak memerlukan patch monyet
String
, dan tidak memerlukan pemindaian seluruh string sepertilastIndexOf
halnya ketika tidak ada kecocokan.Jika Anda ingin mencocokkan string konstan yang mungkin berisi karakter khusus ekspresi reguler, seperti
'$'
, maka Anda dapat menggunakan yang berikut:dan kemudian Anda bisa menggunakannya seperti ini
sumber
lastIndexOf
memindai seluruh string hanya jika tidak menemukan kecocokan, atau menemukan kecocokan di awal. Jika ada kecocokan di akhir maka itu berfungsi proporsional dengan panjang akhiran. Ya,/asdf$/.test(str)
hasil benar ketikastr
diakhiri dengan"asdf"
.if( "mystring#".substr(-1) === "#" ) {}
sumber
slice()
? Ini bekerja untuk saya dalam tes IE7 cepat saya.Ayo, ini adalah
endsWith
implementasi yang benar :menggunakan
lastIndexOf
hanya menciptakan loop CPU yang tidak perlu jika tidak ada kecocokan.sumber
===
.Versi ini menghindari membuat substring, dan tidak menggunakan ekspresi reguler (beberapa jawaban regex di sini akan berfungsi; yang lain rusak):
Jika kinerja penting bagi Anda, sebaiknya uji apakah
lastIndexOf
sebenarnya lebih cepat daripada membuat substring atau tidak. (Ini mungkin tergantung pada mesin JS yang Anda gunakan ...) Mungkin lebih cepat dalam kasus yang cocok, dan ketika string kecil - tetapi ketika string besar itu perlu melihat kembali melalui semuanya bahkan meskipun kami tidak terlalu peduli :(Untuk memeriksa satu karakter, menemukan panjang dan menggunakan
charAt
mungkin merupakan cara terbaik.sumber
str+"$"
sebagai regex rusak, karena mereka mungkin bukan regex yang valid.Tidak melihat apporach dengan
slice
metode. Jadi saya tinggalkan saja di sini:sumber
tidak berfungsi dalam kasus di mana panjang string asli kurang dari panjang string pencarian dan string pencarian tidak ditemukan:
lastIndexOf mengembalikan -1, lalu Anda menambahkan panjang string pencarian dan Anda dibiarkan dengan panjang string asli.
Perbaikan yang mungkin adalah
sumber
Dari developer.mozilla.org String.prototype.endsWith ()
Ringkasan
The
endsWith()
Metode menentukan apakah string berakhir dengan karakter dari string lain, kembali benar atau salah yang sesuai.Sintaksis
Parameter
searchString : Karakter yang akan dicari di akhir string ini.
posisi : Cari di dalam string ini seolah-olah string ini hanya selama ini; default untuk panjang aktual string ini, dijepit dalam rentang yang ditentukan oleh panjang string ini.
Deskripsi
Metode ini memungkinkan Anda menentukan apakah suatu string berakhir atau tidak.
Contohnya
Spesifikasi
Spesifikasi Bahasa ECMAScript Edisi 6 (ECMA-262)
Kompatibilitas browser
sumber
-- Atau --
sumber
saya harap ini membantu
cara tradisional
sumber
Saya tidak tahu tentang Anda, tetapi:
Mengapa menggunakan ekspresi reguler? Mengapa mengacaukan prototipe? substr? Ayo...
sumber
Hanya alternatif cepat lain yang bekerja seperti pesona bagi saya, menggunakan regex:
sumber
Jika Anda menggunakan lodash :
Jika tidak menggunakan lodash, Anda dapat meminjam dari sumbernya .
sumber
Saya baru saja belajar tentang perpustakaan string ini:
http://stringjs.com/
Sertakan file js dan kemudian gunakan
S
variabel seperti ini:Itu juga dapat digunakan di NodeJS dengan menginstalnya:
Kemudian membutuhkannya sebagai
S
variabel:Halaman web juga memiliki tautan ke pustaka string alternatif, jika ini tidak sesuai keinginan Anda.
sumber
sumber
Begitu banyak hal untuk masalah sekecil ini, cukup gunakan Ekspresi Reguler ini
sumber
Sudah bertahun-tahun untuk pertanyaan ini. Biarkan saya menambahkan pembaruan penting untuk pengguna yang ingin menggunakan jawaban chakrit yang paling banyak dipilih.
Fungsi 'endsWith' sudah ditambahkan ke JavaScript sebagai bagian dari ECMAScript 6 (teknologi eksperimental)
Rujuk di sini: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
Oleh karena itu sangat disarankan untuk menambahkan cek untuk keberadaan implementasi asli seperti yang disebutkan dalam jawaban.
sumber
sumber
Cara untuk bukti di masa depan dan / atau mencegah penimpaan prototipe yang ada akan menjadi tes untuk melihat apakah sudah ditambahkan ke prototipe String. Inilah pendapat saya tentang versi berperingkat tinggi non-regex.
sumber
if (!String.prototype.hasOwnProperty("endsWith"))
adalah cara terbaik. Dengantypeof
, "Mootools dan beberapa perpustakaan AJAX lainnya akan mengacaukan Anda", menurut "Crockford on JavaScript - Level 7: ECMAScript 5: The New Parts", pada 15:50 menit.Jawaban chakrit yang diterima adalah cara yang solid untuk melakukannya sendiri. Namun, jika Anda sedang mencari solusi paket, saya sarankan melihat underscore.string , seperti yang ditunjukkan @mlunoe. Menggunakan underscore.string, kodenya adalah:
sumber
jika Anda tidak ingin menggunakan lasIndexOf atau substr maka mengapa tidak melihat string dalam keadaan alami (mis. sebuah array)
atau sebagai fungsi mandiri
sumber
sumber
Setelah semua penghitungan yang panjang itu, saya menemukan potongan kode ini sederhana dan mudah dimengerti!
sumber
Ini adalah implementasi dari tujuan dengan:
String.prototype.endsWith = function (str) { return this.length >= str.length && this.substr(this.length - str.length) == str; }
sumber
Ini adalah implementasi dari
endsWith
:sumber
Ini didasarkan pada jawaban yang diterima @ charkit yang memungkinkan Array string, atau string untuk diteruskan sebagai argumen.
Ini memerlukan underscorejs - tetapi mungkin dapat disesuaikan untuk menghapus ketergantungan garis bawah.
sumber
_.str.endsWith
Manfaat:
sumber
Jangan gunakan ekspresi reguler. Mereka lambat bahkan dalam bahasa cepat. Tulis saja fungsi yang memeriksa ujung string. Perpustakaan ini memiliki contoh yang bagus: groundjs / util.js . Hati-hati menambahkan fungsi ke String.prototype. Kode ini memiliki contoh yang bagus tentang bagaimana melakukannya: groundjs / prototype.js Secara umum, ini adalah pustaka tingkat bahasa yang bagus: groundjs Anda juga dapat melihat pada lodash
sumber
semuanya adalah contoh yang sangat berguna. Menambahkan
String.prototype.endsWith = function(str)
akan membantu kita cukup memanggil metode untuk memeriksa apakah string kita berakhir atau tidak, juga regexp juga akan melakukannya.Saya menemukan solusi yang lebih baik daripada solusi saya. Terimakasih semuanya.
sumber
Untuk naskah kopi
sumber