Soru JavaScript'de bir dizenin bir alt dizgi içerip içermediğini nasıl kontrol edebilirim?


Genellikle beklerdim String.contains() yöntem, ama bir tane görünmez.

Bunu kontrol etmek için makul bir yol nedir?


7436
2017-11-24 13:05


Menşei


İndexOf yöntemi ile kolay, burada indexOf ve substring eğitimi görülebilir: dreamsyssoft.com/javascript-shell-scripting/... - Triton Man
olası kopyası JQuery dizesi denetimi içerir - Saswat
hızını görebilirsiniz r.indexOf(s) !== -1; diğerlerinden daha hızlı. hayageek.com/javascript-string-contains - Sherali Turdiyev
Burada bir dizenin bir dizede olup olmadığını kontrol etmenin en yaygın yolları için bir ölçüt: jsben.ch/#/o6KmH - EscapeNetscape
Aşağıdaki seçeneklerden en iyi olanı <5 dakikada burada görebilirsiniz: youtube.com/watch?v=KENPi0xTgcE - ssmith


Cevaplar:


İşte mevcut olasılıkların listesi:

1. (ES6) includes-cevap vermek

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

2. ES5 ve daha eski indexOf

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

String.prototype.indexOf dizginin konumunu diğer dizede döndürür. Bulunmazsa geri dönecek -1.

3. search-cevap vermek

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

4. lodash içerir-cevap vermek

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

5. RegExp-cevap vermek

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

6. Maç-cevap vermek

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

Performans testleri bunu gösteriyor indexOf Hızın önemli olduğu bir noktaya gelirse en iyi seçim olabilir.


11489
2017-12-30 04:23



@Steve indexOf her zaman bir sayı döndürür, bu yüzden kullanmaya gerek yoktur !==. Eğer bayttan tasarruf etmek isterseniz ~'foo'.indexOf('oo') alt dizgi bulunursa bir doğruluk değeri döndürür ve bir falsi değeri (0) eğer değilse. - Mathias Bynens
Meraklı olanlar için: ikinin tamamlayıcı sistemlerinde -1, tüm 1'ler halinde ikili olarak temsil edilir (3211 için 1111 1111 1111 1111 1111 1111 1111 1111). Bunun bitsel tersi (~) hepsi sıfır, ya da sadece sıfırdır, ve bu nedenle de falsidir. Bu yüzden squiggle numarası işe yarıyor ve eğer kendim söylemem gerekirse oldukça kötü. - Adam Tolley
@SebNilsson dahil etmeyi unuttun ~ yorumumda önerdiğim operatör. ~'hello'.indexOf('h'); // -1, which is truthy, fakat ~'hello'.indexOf('x'); // 0, which is falsy. - Mathias Bynens
@ pramodc84 bu bağlantıyı ifade eder Array nesne indexOf yöntem değil String nesne yöntemi - gion_13
@NicolasBarbulesco Koduma bakan herkesin bileceklerinden eminim. [["\t\n 987654321e-400"]] === 0 yanlış. Koduma bakan herkesin bunu bileceğinden çok daha az eminim [["\t\n 987654321e-432"]] == 0 doğru. - kybernetikos


Kolayca ekleyebilirsiniz contains Bu ifade ile Dize yöntemi:

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

Not: Bunu kullanmadığınız için geçerli bir argüman için aşağıdaki yorumlara bakın. Tavsiyem: kendi kararını kullan.

Alternatif:

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

823
2017-11-24 14:17



Sahip olmadığınız nesneleri değiştirmeyin. nczonline.net/blog/2010/03/02/... - zachleat
@zachleat, pratikte anlaşılabilir. Ancak "foobar" .contains ("bar") kural için gerçekten yararlı bir istisna olacaktır. - ndbroadbent
Eh, benim tercihim zihinsel modelimi JavaScript'e uyacak ve sadece indexOf kullanacak. Gelecek olan JavaScripter için kodun anlaşılmasını kolaylaştıracak ve okuyacaktır. - zachleat
if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; } - Pavel Hodek
Bu tür indeksOf'ları sık sık kullanacaksanız, bu işlevi kullanmak tercih edilir. @zachleat, indexOf'u kullanmanın içerden daha okunabilir olduğunu kabul etmem. İçeriği neler olduğunu, nerede olduğunu indexOf() != -1 bu kadar şeffaf olmayabilir. Ama her biri kendi başına, sen de güvendiğin sürece. - smdrager


Kodunuzdaki sorun, JavaScript'in büyük / küçük harfe duyarlı olmasıdır. Yöntem çağrı

indexof()

aslında olmalı

indexOf()

Düzeltmeyi deneyin ve bunun işe yarayıp yaramadığını görün:

if (test.indexOf("title") !=-1) {
    alert(elm);
    foundLinks++;
}

429
2018-01-07 10:23



@JeremyW, bu noktada şunu söyleyebilirim ki, bu cevabın değeri, aynı hatayı yapan insanlardır.indexof yerine indexOf) bu cevabı bulabilir ve neler olduğunu görebilir. Artık soruya dokunmayacağım. - Victor


Var string.includes ES6’da:

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

Yüklemeniz gerekebileceğini unutmayın es6-shim veya daha eski tarayıcılarda çalışmak için benzer.

require('es6-shim')

361
2017-11-24 13:06



çünkü diğer dillerde "içermek" için kullanıldık ve sadece kendi özelliğimi uygulayabildim, sadece hatayla karşılaştım. Yani, destek hakkında kısa geri bildirim. Firefox 19 - OSX => Tamam, Firefox 19 - Windows => NOK, Chrome - OSX, Windows => NOK - Patrick Hammer
Bunun gibi? String.prototype.contains = function (segment) { return this.indexOf(segment) !== -1; }; (BTW: Prototip üzerinde şeyler yapmak kötüdür) - Nijikokun
Kromda destek değildir ..... :( - Krunal Patel
@Norris ES6'da. ES6 şimini yükleyin. Şimdi kullanabilirsin. - mikemaccana
.contains () ve .includes () hem deneysel, hem de standart dışıdır. Kullanımlarını üretim sistemlerinde önermem. Şimdilik .indexOf () ile yapışırdım. - Mike S.


var index = haystack.indexOf(needle);

341
2018-03-05 09:53





JavaScript'i kullanabilirsiniz search() yöntem.

Sözdizimi şöyledir: string.search(regexp)

Eşleşmenin konumunu veya eşleşme bulunamazsa -1 değerini döndürür.

Orada örnekleri gör: jsref_search

Karmaşık bir düzenli ifade sözdizimine ihtiyacınız yoktur. Onlara aşina değilseniz basit st.search("title") yapacağım. Eğer testinizin büyük / küçük harf duyarsız olmasını istiyorsanız, o zaman yapmalısınız. st.search(/title/i).


237
2017-10-21 05:31



Bu RegEx ayrıştırmak zorunda kalacak çünkü indexOf işlevi daha yavaş olurdu gibi görünüyor. Bununla birlikte, eğer bir şeyleri duyarsız kılmak istiyorsanız, sizin istemeniz olmasa da, yolunuz gitmenin yolu olacaktır (sanırım). Sorulmasa bile, buna oy veriyorum sadece  Çünkü büyük / küçük harfe duyarlı olmayan seçenek. - bgw
Ben bir ölçüt yok, ama str.toLowerCase().indexOf(searchstr.toLowerCase()) Büyük / küçük harfe duyarlı arama için daha verimli ol - Tim S.
Bir kıyaslama ile ve arama, duyarsız arama için daha etkilidir. jsperf.com/string-compare-perf-test Ancak, bazı karakterlerden kaçmanız gerektiğinde normal ifadeleri kullanmanız zor olabilir. - misaxi
Arama, hatalara yol açabilir. Misaxi'nin dediği gibi, bazı karakterlerden kaçmak zorundasınız. Parametrenin bir normal ifadeyi beklediğini ve boru karakterini aradığını fark etmeden arama kullanıyordum. Sonuçta, herhangi bir dize .search ('|') == 0. - James Foster
Serach metnini güvenli hale getirmek için bir escapeRegExp işlevi kullanabilirsiniz. function escapeRegExp(string){ return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); }itibaren developer.mozilla.org/en/docs/Web/JavaScript/Guide/... - Mark


String.prototype.includes() ES6'da tanıtıldı.

Bir dizenin başka bir dizede bulunup bulunmayacağını belirler.   Doğru veya yanlış olarak uygun şekilde döndürme.

Sözdizimi

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

Parametreler

searchString

Bu dizede aranacak bir dize.

position

Aramaya başlamak için bu dizede konum searchString varsayılanı 0'dır.

Örnek

var str = "To be, or not to be, that is the question.";

console.log(str.includes("To be"));    // true
console.log(str.includes("question")); // true
console.log(str.includes("To be", 1)); // false  

Not

Bu eski tarayıcılarda ES6 shim gerektirebilir.


167
2018-05-29 07:46



FWIW bağlı MDN sayfasının basit bir shim / polyfill vardır: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - Salman Abbas