Bagaimana cara memeriksa apakah string berisi substring dalam javascript?

Biasanya, saya mengharapkan String.contains() , tetapi sepertinya tidak ada.

Apa cara yang masuk akal untuk memverifikasi ini?

7436
24 нояб. atur gramm 24 nov. 2009-11-24 16:04 '09 pada 16:04 2009-11-24 16:04
@ 49 balasan
  • 1
  • 2

Berikut adalah daftar fitur saat ini:

1. (ES6) includes - pergi ke jawabannya

 var string = "foo", substring = "oo"; string.includes(substring); 

2. ES5 dan indexOf lebih lama

 var string = "foo", substring = "oo"; string.indexOf(substring) !== -1; 

String.prototype.indexOf mengembalikan posisi string dalam string lain. Jika tidak ditemukan, itu akan mengembalikan -1 .

3. search - pergi ke jawabannya

 var string = "foo", expr = /oo/; string.search(expr); 

4. lodash termasuk - pergi ke jawabannya

 var string = "foo", substring = "oo"; _.includes(string, substring); 

5. RegExp - pergi ke jawabannya

 var string = "foo", expr = /oo/; // no quotes here expr.test(string); 

6. Cocok - pergi ke jawab

 var string = "foo", expr = /oo/; string.match(expr); 

Tes kinerja menunjukkan bahwa indexOf mungkin merupakan pilihan terbaik jika menyangkut fakta bahwa kecepatan itu penting.

11502
24 нояб. Jawabannya diberikan oleh Fabien Ménager 24 nov. 2009-11-24 16:05 '09 pada 16:05 2009-11-24 16:05

Anda dapat dengan mudah menambahkan metode contains ke String menggunakan pernyataan ini:

 String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; 

Catatan: lihat komentar di bawah ini untuk argumen yang valid untuk tidak menggunakannya. Saran saya: gunakan pendapat Anda sendiri.

border=0

Atau:

 if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; } 
823
30 дек. Jawaban Avi Flax adalah 30 Des. 2009-12-30 07:23 '10 pada 7:23 pagi 2009-12-30 07:23

Masalah dengan kode Anda adalah bahwa javascript peka terhadap huruf besar-kecil. Panggilan metode

 indexof() 

harus

 indexof() 

Cobalah untuk memperbaikinya dan lihat apakah itu membantu:

 if (test.indexOf("title") !=-1) { alert(elm); foundLinks++; } 
429
24 нояб. Jawabannya diberikan Victor 24 Nov. 2009-11-24 17:17 '09 pada 17:17 2009-11-24 17:17

Ada string. Termasuk di ES6 :

 "potato".includes("to"); > true 

Harap dicatat bahwa Anda mungkin perlu mengunduh es6-shim atau sejenis agar ini dapat bekerja di browser yang lebih lama.

 require('es6-shim') 
361
07 янв. jawabannya diberikan eliocs 07 januari . 2013-01-07 13:23 '13 pada 13:23 2013-01-07 13:23
 var index = haystack.indexOf(needle); 
341
24 нояб. jawabannya diberikan pixeline 24 nov. 2009-11-24 16:06 '09 pada 16:06 2009-11-24 16:06

Anda dapat menggunakan metode search() JavaScript.

Sintaks: string.search(regexp)

Mengembalikan posisi pertandingan, atau -1 jika pertandingan tidak ditemukan.

Lihat contoh: jsref_search

Anda tidak perlu sintaks ekspresi reguler yang kompleks. Jika Anda tidak terbiasa dengan mereka, itu akan melakukan st.search("title") sederhana st.search("title") . Jika Anda ingin tes Anda tidak peka huruf besar-kecil, Anda harus melakukan st.search(/title/i) .

237
05 марта '10 в 12:53 2010-03-05 12:53 Jawaban diberikan oleh Tardis pada 05 Maret '10 pada 12:53 2010-03-05 12:53

String.prototype.includes() diperkenalkan di ES6.

Menentukan apakah satu string dapat ditemukan di string lain, masing-masing mengembalikan benar atau salah.

Sintaks

 var contained = str.includes(searchString [, position]); 

Parameter

 searchString 

String yang dicari di dalam string ini.

 position 

Posisi dalam string ini tempat Anda ingin memulai searchString pencarian pencarian secara default 0.

Contoh

167
21 окт. jawaban yang diberikan oleh Aniket Kulkarni 21 Okt. 2013-10-21 08:31 '13 pukul 8:31 pagi 2013-10-21 08:31

Jika Anda mencari alternatif untuk menulis check-ugly -1, alih-alih Anda menambahkan ~ tilde.

 if (~haystack.indexOf('needle')) alert('found'); 

Joe Zimmerman - Anda akan melihat bahwa menggunakan ~ pada -1 mengkonversikannya menjadi 0. Angka 0 salah, yang berarti bahwa itu akan dihitung sebagai salah ketika dikonversi ke boolean. Pada awalnya, ini mungkin tidak tampak sangat kuat, tetapi ingat bahwa fungsi, seperti indexOf, mengembalikan -1 ketika kueri tidak ditemukan. Ini berarti bahwa alih-alih menulis sesuatu seperti ini:

 if (someStr.indexOf("a") >= 0) { // Found it } else { // Not Found } 

Sekarang Anda mungkin memiliki lebih sedikit karakter dalam kode sehingga Anda dapat menulis misalnya:

 if (~someStr.indexOf("a")) { // Found it } else { // Not Found } 

Lebih detail di sini

120
12 мая '14 в 1:22 2014-05-12 01:22 Jawaban diberikan oleh Christian Landgren pada 12 Mei '14 pada 1:22 2014-05-12 01:22

Bagian kode ini harus bekerja dengan baik:

 var str="This is testing for javascript search !!!"; if(str.search("for") != -1) { //logic } 
82
29 мая '12 в 10:46 2012-05-29 10:46 jawabannya diberikan oleh vaibhav pada 29 Mei '12 pada 10:46 2012-05-29 10:46

Cara umum untuk menulis metode contains dalam javascript adalah :

 if (!String.prototype.contains) { String.prototype.contains = function (arg) { return !!~this.indexOf(arg); }; } 

Operator negasi bitwise ( ~ ) digunakan untuk mengubah -1 menjadi 0 (falsey), dan semua nilai lainnya akan menjadi nol (true).

Operator dengan negasi Boolean ganda digunakan untuk menerjemahkan angka menjadi angka yang logis.

77
13 сент. jawabannya diberikan zzzzBov 13 September . 2012-09-13 06:45 '12 pada pukul 6:45 pagi 2012-09-13 06:45

Dalam ES5

76
08 авг. jawabannya diberikan Nisar 08 Agustus. 2015-08-08 14:44 '15 pada 14:44 2015-08-08 14:44

Alih-alih menggunakan potongan kode yang ditemukan di sana-sini di Internet, Anda juga dapat menggunakan pustaka yang teruji dan terdokumentasi dengan baik. Dua opsi yang saya sarankan:


Opsi 1: Gunakan Lodash : sudah includes :

 _.includes('foobar', 'ob'); // → true 

Lodash adalah ketergantungan pustaka javascript yang paling populer untuk npm dan memiliki banyak metode utilitas javascript yang berguna. Jadi untuk banyak proyek, Anda masih menginginkan ini; -)


Opsi kedua: Atau gunakan Underscore.string : ia memiliki metode include :

 _.str.include('foobar', 'ob'); // → true 

Berikut adalah deskripsi Underscore.string, itu hanya menambah 9kb, tetapi memberi Anda semua keuntungan yang dimiliki oleh perpustakaan yang teruji dan terdokumentasi dengan baik pada fragmen kode copy'n'paste:

Underscore.string adalah pustaka JavaScript untuk manipulasi string yang mudah, ekstensi untuk Underscore.js, terinspirasi oleh Prototype.js, Right.js, Underlining, dan bahasa Ruby yang indah.

Underscore.string memberi Anda beberapa fungsi yang berguna: melapisi, membersihkan, memasukkan, menghitung, escapeHTML, unescapeHTML, menyisipkan, menyambungkan, dimulai dengan, berakhir, dengan header, pemangkasan, pemangkasan, dll.

Perhatikan bahwa Underscore.string dipengaruhi oleh Underscore.js , tetapi dapat digunakan tanpanya.


Terakhir tetapi tidak kalah pentingnya: Metode includes bawaan dilengkapi dengan versi JavaScript ES6:

 'foobar'.includes('ob'); // → true 

Sebagian besar browser modern sudah mendukungnya, perhatikan tabel kompatibilitas ES6 .

64
13 дек. Jawabannya diberikan nachtigall 13 Des. 2013-12-13 23:05 '13 pada 11:05 PM 2013-12-13 23:05

Anda dapat menggunakan jQuery :contains pemilih.

 $("div:contains('John')") 

Catatan di sini: berisi-pemilih

63
14 марта '11 в 5:10 2011-03-14 05:10 jawabannya diberikan Chorinator 14 Maret '11 pukul 5:10 pagi 2011-03-14 05:10

Gunakan ekspresi reguler:

RegExp.test(string)

61
24 нояб. jawabannya diberikan rahul 24 Nov. 2009-11-24 16:13 '09 pada 16:13 2009-11-24 16:13

Itu hanya bekerja untuk saya. Dia memilih garis yang tidak mengandung istilah "Dihapus:"

 if (eventString.indexOf("Deleted:") == -1) 
49
21 окт. jawaban yang diberikan writtinfool 21 Okt. 2011-10-21 00:50 '11 pada 0:50 2011-10-21 00:50

Cara lain untuk melakukan ini adalah:

Anda dapat menggunakan fungsi kecocokan, yaitu, sesuatu seperti:

 x = "teststring"; if (x.match("test")) { // Code } 

match () juga dapat bekerja dengan ekspresi reguler:

 x = "teststring"; if (x.match(/test/i)) { // Code } 
49
29 сент. Balas diberikan oleh David Craig 29 Sep 2012-09-29 13:40 '12 pada 13:40 2012-09-29 13:40

Anda mencari .indexOf MDN .

indexOf akan mengembalikan subscript subskrip. Indeks akan berkorelasi dengan di mana substring dimulai. Jika tidak ada kecocokan, -1 dikembalikan. Berikut ini adalah demonstrasi sederhana dari konsep ini:

29 авг. Balas diberikan oleh Travis J 29 Agt. 2013-08-29 02:23 '13 pada 2:23 2013-08-29 02:23

Anda perlu memanggil indexOf dengan huruf kapital "O", seperti yang ditunjukkan. Perlu juga dicatat bahwa dalam kata yang dilindungi undang-undang kelas JavaScript, Anda harus menggunakan className untuk mendapatkan atribut data ini. Alasan kemungkinan gagal adalah bahwa ia mengembalikan nilai nol. Anda dapat melakukan yang berikut untuk mendapatkan nilai kelas Anda ...

 var test = elm.getAttribute("className"); //or var test = elm.className 
48
24 нояб. Jawaban diberikan oleh MillsJROSS 24 Nov 2009-11-24 18:52 '09 pada 18:52 2009-11-24 18:52

Karena pertanyaannya cukup populer, saya pikir saya bisa menambahkan sedikit rasa modern ke kode.

 // const : creates an immutable constant const allLinks = document.getElementsByTagName("a"); // [].reduce.call : gives access to the reduce method on a HTMLCollection // () => {} : ES6 arrow function const foundLinks = [].reduce.call(allLinks, (sum, link) => { // bitwise OR : converts the boolean value to a number return sum + (link.classList.contains("title") | 0); }, 0); // template literal console.log('Found ${foundLinks || "no"} title class'); 

BTW, jawaban yang benar adalah indexOf atau String.contains . Memuat pustaka eksternal (terutama jika kode ditulis dalam javascript murni) atau mengacaukan String.prototype atau menggunakan ekspresi reguler sudah terlalu jauh.

34
27 окт. Balas oleh Jay Harris 27 Okt 2013-10-27 18:53 '13 pada 18:53 2013-10-27 18:53

Ada cara yang ramping dan lebih baik untuk melakukan ini, dan menggunakan operator (BitWise TIDAK).

 if(~"John".indexOf("J")) { alert("Found") } else { alert("Not Found"); } 

Bitwise tidak mengonversi "x" ke - (x + 1), jadi jika x diperoleh -1 dari metode indexOf, maka itu akan dikonversi menjadi - (-1 + 1) = -0, yang merupakan nilai salah.

27
07 дек. Jawabannya diberikan Kiba 07 Desember. 2014-12-07 14:05 '14 pada 14:05 2014-12-07 14:05

String.prototype.indexOf() atau String.prototype.search() ?!

Seperti yang telah disebutkan, string JavaScript memiliki indexOf dan search .

Perbedaan utama antara keduanya adalah bahwa indexOf hanya digunakan untuk substring sederhana, sementara search juga mendukung ekspresi reguler. Tentu saja, keuntungan menggunakan indexOf adalah lebih cepat.

Lihat juga Di JavaScript, apa perbedaan antara indexOf () dan search ()? .

Menerapkan metode Anda sendiri String.prototype.contains()

Jika Anda ingin menambahkan metode contains Anda sendiri ke setiap baris, cara terbaik untuk melakukannya adalah @zzzzBov :

 if (!String.prototype.contains) { String.prototype.contains = function (arg) { return !!~this.indexOf(arg); }; } 

Anda akan menggunakannya sebagai berikut:

 'Hello World'.contains('orl'); 

Menerapkan utilitas khusus

Sebagai contoh, biasanya tidak disarankan untuk menambahkan metode Anda sendiri ke objek standar dalam JavaScript, karena ini dapat merusak kompatibilitas.

Jika Anda benar-benar membutuhkan metode contains Anda sendiri dan / atau metode string khusus lainnya, lebih baik membuat perpustakaan utilitas Anda sendiri dan menambahkan metode string Anda sendiri ke perpustakaan ini:

 var helper = {}; helper.string = { contains : function (haystack, needle) { return !!~haystack.indexOf(needle); }, ... }; 

Anda akan menggunakannya sebagai berikut:

 helper.string.contains('Hello World', 'orl'); 

Menggunakan perpustakaan utilitas pihak ketiga

Jika Anda tidak ingin membuat perpustakaan pendukung Anda sendiri, tentu saja selalu ada kesempatan untuk menggunakan perpustakaan utilitas pihak ketiga. Seperti @nachtigall disebutkan, yang paling populer adalah Lodash dan Underscore.js .

Di Lodash, Anda dapat menggunakan _.includes() , yang Anda gunakan sebagai berikut:

 _.includes('Hello World', 'orl'); 

Di Underscore.js, Anda dapat menggunakan _.str.include() , yang Anda gunakan sebagai berikut:

 _.str.include('Hello World', 'orl'); 
24
21 февр. Balas diberikan oleh John Slegers 21 Feb. 2016-02-21 19:52 '16 pada 19:52 2016-02-21 19:52

Solusi paling sederhana

 if (!String.prototype.contains) { String.prototype.contains= function() { return String.prototype.indexOf.apply(this, arguments) !== -1; }; } 

Anda bisa menggunakan sebagai berikut

 "hello".contains("he") // true "hello world".contains("lo w")//true "hello world".contains("lo wa")//false "hello world".contains(" ")//true "hello world".contains(" ")//false 

MDN Link

23
21 авг. balasan yang diberikan oleh Sriramajeyam Sugumaran 21 Agu. 2015-08-21 12:45 '15 jam 12:45 malam 2015-08-21 12:45
22
08 нояб. jawabannya diberikan oleh user663031 08 Nov. 2014-11-08 08:38 '14 pukul 8:38 pagi 2014-11-08 08:38

Contoh

 var a = "Test String"; if(a.search("ring")!=-1){ //exist } else { //not found } 
22
12 нояб. Balas diberikan oleh Ali Abbas pada 12 November 2015-11-12 16:11 '15 pada 16:11 2015-11-12 16:11

Kode JavaScript untuk menggunakan metode contains dalam array:

 <html> <head> <h2>Use of contains() method</h2> <script> Array.prototype.contains = function (element) { for (var i = 0; i < this.length; i++) { if (this[i] == element) { return true; } } return false; } arr1 = ["Rose", "India", "Technologies"]; document.write("The condition is "+arr1.contains("India")+"<br>"); </script> </head> <b>[If the specified element is present in the array, it returns true otherwise returns false.]</b> </html> 

Dalam kode ini, metode contains menentukan apakah elemen yang ditentukan ada dalam array atau tidak. Jika elemen yang ditentukan hadir dalam array, ia mengembalikan true, jika tidak itu mengembalikan false.

21
28 февр. Jawabannya diberikan oleh Tarun Gupta 28 Feb. 2013-02-28 10:50 '13 pada 10:50 2013-02-28 10:50

Untuk mengumpulkan beberapa solusi yang valid:

19
16 июня '15 в 15:08 2015-06-16 15:08 jawabannya diberikan pada 16 Juni 15 pada 15:08 2015-06-16 15:08

Karena ada keluhan tentang penggunaan prototipe, dan karena penggunaan indexOf membuat kode Anda kurang mudah dibaca dan karena regexp penuh:

 function stringContains(inputString, stringToFind) { return (inputString.indexOf(stringToFind) != -1); } 

Ini adalah kompromi yang saya dapatkan.

17
22 авг. jawabannya diberikan Tjaart 22 Agustus. 2013-08-22 14:40 '13 pada 14:40 2013-08-22 14:40

Javascript

  var str = "My big string contain apples and oranges"; var n = str.indexOf("apples"); alert(n); //will alert 22, -1 if not found 

Jquery

  <p>My big string contain apples and oranges</p> alert($("p:contains(apples)")[0] != undefined); //will alert true if found 
17
16 дек. Jawabannya diberikan oleh Alain Gauthier 16 Des. 2014-12-16 19:48 '14 pada 19:48 2014-12-16 19:48

Gunakan string bawaan dan paling sederhana, yaitu match() dalam string. Untuk mencapai apa yang Anda harapkan, lakukan hal berikut:

 var stringData ="anyString Data"; var subStringToSearch = "any"; // This will give back the substring if matches and if not returns null var doesContains = stringData.match(subStringToSearch); if(doesContains !=null) { alert("Contains Substring"); } 
13
02 мая '14 в 23:08 2014-05-02 23:08 jawabannya diberikan oleh Ankur Madaan 02 Mei '14 pukul 23:08 2014-05-02 23:08

Cara termudah adalah dengan menggunakan indexOf . Untuk cukup memeriksa string untuk substring substring, Anda dapat menggunakan metode ini:

 string = "asdf"; substr = "as"; alert(string.indexOf(substr) == -1 ? false : true); 

Saat Anda membutuhkan fungsi string.contains() , Anda bisa menerapkannya sendiri sebagai berikut:

 String.prototype.contains = function(test) { return this.indexOf(test) == -1 ? false : true; }; 

Sekarang Anda dapat menggunakan metode pendek ecen ini untuk memeriksa apakah string berisi substring khusus:

 string = "asdf"; alert(string.contains("as")); 

Ini JSFiddle .

13
27 мая '14 в 15:52 2014-05-27 15:52 jawabannya diberikan oleh frieder pada 27 Mei '14 pukul 15:52 2014-05-27 15:52
  • 1
  • 2

Pertanyaan lain tentang tag tag atau Ajukan pertanyaan