सवाल यह जांचने के लिए कि क्या स्ट्रिंग में जावास्क्रिप्ट में एक सबस्ट्रिंग है?


आमतौर पर मैं एक उम्मीद करता हूँ String.contains() विधि, लेकिन ऐसा प्रतीत नहीं होता है।

इसके लिए जांच करने का एक उचित तरीका क्या है?


7436
2017-11-24 13:05


मूल


IndexOf विधि के साथ यह आसान है, आप indexOf का एक ट्यूटोरियल देख सकते हैं और यहां सबस्ट्रिंग कर सकते हैं: dreamsyssoft.com/javascript-shell-scripting/... - Triton Man
के संभावित डुप्लिकेट JQuery स्ट्रिंग में चेक शामिल है - Saswat
आप की गति देख सकते हैं r.indexOf(s) !== -1; दूसरों की तुलना में सबसे तेज़ hayageek.com/javascript-string-contains - Sherali Turdiyev
एक स्ट्रिंग में स्ट्रिंग है या नहीं, यह जांचने के सबसे सामान्य तरीकों के लिए यहां एक बेंचमार्क है: jsben.ch/#/o6KmH - EscapeNetscape
वीडियो <5 मिनट में नीचे दिए गए विकल्पों में से सर्वश्रेष्ठ को कवर करता है, यहां: youtube.com/watch?v=KENPi0xTgcE - ssmith


जवाब:


वर्तमान संभावनाओं की एक सूची यहां दी गई है:

1. (ईएस 6) includes-जवाब देने के लिए जाओ

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

2. ईएस 5 और पुराने indexOf

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

String.prototype.indexOf दूसरी स्ट्रिंग में स्ट्रिंग की स्थिति देता है। यदि नहीं मिला, तो यह वापस आ जाएगा -1

3। search-जवाब देने के लिए जाओ

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

4. lodash शामिल हैं-जवाब देने के लिए जाओ

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

5. RegExp-जवाब देने के लिए जाओ

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

6. मैच-जवाब देने के लिए जाओ

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

प्रदर्शन जांच यह दिखा रहे हैं indexOf यदि यह उस बिंदु पर आता है जहां गति मायने रखती है तो सबसे अच्छा विकल्प हो सकता है।


11489
2017-12-30 04:23



@Steve indexOf हमेशा एक संख्या देता है इसलिए उपयोग करने की कोई आवश्यकता नहीं है !==। यदि आप बाइट्स को सहेजना चाहते हैं, तो आप इसका उपयोग कर सकते हैं ~'foo'.indexOf('oo') जो सबस्ट्रिंग पाया जाता है, और एक झूठा मूल्य (जो एक वास्तविक मूल्य देता है)0) अगर यह नहीं है। - Mathias Bynens
उत्सुकता के लिए: दो की तारीफ प्रणालियों में -1 -1 बाइनरी में प्रतिनिधित्व किया जाता है क्योंकि सभी 1s (1111 1111 1111 1111 1111 1111 1111 1111 32 बिट के लिए)। इसका bitwise उलटा (~) सभी शून्य, या सिर्फ शून्य है, और इसलिए झूठी है। यही कारण है कि घुमावदार चाल काम करता है, और अगर मैं खुद को इतना कहना चाहूंगा तो यह बहुत बुरा है। - Adam Tolley
@ सेबनिल्सन आप शामिल करना भूल गए ~ ऑपरेटर जो मैंने अपनी टिप्पणी में सुझाव दिया था। ~'hello'.indexOf('h'); // -1, which is truthy, परंतु ~'hello'.indexOf('x'); // 0, which is falsy। - Mathias Bynens
@ pramodc84 कि लिंक को संदर्भित करता है Array वस्तु indexOf विधि नहीं है String ऑब्जेक्ट विधि - gion_13
@ निकोलस बरबुल्स्को मुझे विश्वास है कि मेरे कोड को देखने वाले सभी लोग यह जान लेंगे [["\t\n 987654321e-400"]] === 0 गलत है। मुझे बहुत कम विश्वास है कि जो भी मेरे कोड को देखता है वह उसे जानता होगा [["\t\n 987654321e-432"]] == 0 सच हैं। - kybernetikos


आप आसानी से एक जोड़ सकते हैं contains इस कथन के साथ स्ट्रिंग करने की विधि:

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

ध्यान दें: इसका उपयोग न करने के लिए वैध तर्क के लिए नीचे दी गई टिप्पणियां देखें। मेरी सलाह: अपने निर्णय का प्रयोग करें।

वैकल्पिक रूप से:

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

823
2017-11-24 14:17



उन वस्तुओं को संशोधित न करें जिनके पास आपके स्वामित्व नहीं हैं। nczonline.net/blog/2010/03/02/... - zachleat
@zachleat, जो अभ्यास में समझ में आता है। लेकिन "foobar" .contains ("बार") नियम के लिए वास्तव में उपयोगी अपवाद होगा। - ndbroadbent
एह, मेरी प्राथमिकता जावास्क्रिप्ट फिट करने के लिए मेरे मानसिक मॉडल को अनुकूलित करना होगा और केवल indexOf का उपयोग करना होगा। इससे अगले जावास्क्रिप्टर के लिए कोड को समझना आसान हो जाएगा और इसे पढ़ना होगा। - zachleat
if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; } - Pavel Hodek
यदि आप इस तरह के इंडेक्स का उपयोग करने जा रहे हैं तो अक्सर यह इस फ़ंक्शन का उपयोग करने के लिए प्राथमिक है। @zachleat, मैं असहमत होगा कि indexOf का उपयोग करने से अधिक पठनीय है। इसमें बताया गया है कि क्या हो रहा है, कुछ कहां से हो रहा है indexOf() != -1 इतना पारदर्शी नहीं हो सकता है। लेकिन जब तक आप लगातार होते हैं, तब तक प्रत्येक के लिए। - smdrager


आपके कोड के साथ समस्या यह है कि जावास्क्रिप्ट केस संवेदनशील है। आपकी विधि कॉल

indexof()

वास्तव में होना चाहिए

indexOf()

इसे ठीक करने का प्रयास करें और देखें कि क्या इससे मदद मिलती है:

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

429
2018-01-07 10:23



@ जेरेमीडब्ल्यू, मैं इस बिंदु पर कहूंगा कि इस उत्तर का मूल्य यह है कि जिन लोगों ने यह वही गलती की है (indexof के बजाय indexOf) यह जवाब पा सकते हैं और देख सकते हैं कि क्या हो रहा है। मैं अब और सवाल नहीं छूंगा। - Victor


वहां एक है string.includes ईएस 6 में:

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

नोट आपको लोड करने की आवश्यकता हो सकती है es6-shim या पुराने ब्राउज़र पर काम करने के समान।

require('es6-shim')

361
2017-11-24 13:06



क्योंकि मुझे अन्य भाषाओं में "शामिल" करने के लिए उपयोग किया गया था और बस इसके साथ मेरी सुविधा लागू की गई, मैं बस त्रुटि में भाग गया। तो, समर्थन के बारे में कम प्रतिक्रिया। फ़ायरफ़ॉक्स 1 9 - ओएसएक्स => ठीक है, फ़ायरफ़ॉक्स 1 9 - विंडोज => एनओके, क्रोम - ओएसएक्स, विंडोज => एनओके - Patrick Hammer
इस कदर? String.prototype.contains = function (segment) { return this.indexOf(segment) !== -1; }; (बीटीडब्ल्यू: प्रोटोटाइप पर चीजें करना बुरा है) - Nijikokun
यह क्रोम ..... :( में समर्थन नहीं है - Krunal Patel
@ नॉरिस यह ईएस 6 में है। लोड ES6 शिम। अब आप इसका इस्तेमाल कर सकते हैं। - mikemaccana
.contains () और .includes () दोनों प्रयोगात्मक, पुनः: गैर मानक हैं। मैं उत्पादन प्रणालियों में उनके उपयोग की सिफारिश नहीं करता। मैं अब के लिए .indexOf () के साथ रहना होगा। - Mike S.


var index = haystack.indexOf(needle);

341
2018-03-05 09:53





आप जावास्क्रिप्ट का उपयोग कर सकते हैं search() तरीका।

सिंटेक्स है: string.search(regexp)

यह मैच की स्थिति देता है, या -1 यदि कोई मैच नहीं मिलता है।

वहां उदाहरण देखें: jsref_search

आपको एक जटिल नियमित अभिव्यक्ति वाक्यविन्यास की आवश्यकता नहीं है। यदि आप उनके साथ एक साधारण परिचित नहीं हैं st.search("title") करूँगा। यदि आप चाहते हैं कि आपका परीक्षण केस असंवेदनशील हो, तो आपको करना चाहिए st.search(/title/i)


237
2017-10-21 05:31



ऐसा लगता है कि यह इंडेक्सऑफ फ़ंक्शन की तुलना में धीमा होगा क्योंकि इसे RegEx को पार्स करना होगा। हालांकि, अगर आप कुछ मामला असंवेदनशील चाहते हैं, तो आपका रास्ता (मुझे लगता है) जाने का तरीका होगा, हालांकि यह नहीं पूछा गया था। भले ही यह नहीं पूछा गया था, मैं इसे वोट दे रहा हूं केवल  इसलिये मामले असंवेदनशील विकल्प के। - bgw
मैंने एक बेंचमार्क नहीं चलाया है, लेकिन होगा str.toLowerCase().indexOf(searchstr.toLowerCase()) केस-असंवेदनशील खोज के लिए अधिक कुशल हो? - Tim S.
एक बेंचमार्क के साथ और यह पता चला है कि खोज असंवेदनशील खोज के लिए खोज अधिक कुशल है। jsperf.com/string-compare-perf-test लेकिन रेगेक्स खोज का उपयोग करना मुश्किल हो सकता है क्योंकि आपको कुछ पात्रों से बचने की आवश्यकता है। - misaxi
खोज बग का कारण बन सकती है। जैसा कि misaxi ने कहा, तो आप कुछ पात्रों से बचने के लिए है। मैं खोज का उपयोग नहीं कर रहा था यह महसूस नहीं कर रहा था कि पैरामीटर को रेगेक्स की उम्मीद है, और पाइप चरित्र की खोज कर रहा था। जैसा कि यह निकलता है, कोई स्ट्रिंग। खोज ('|') == 0। - James Foster
आप serach टेक्स्ट को सुरक्षित बनाने के लिए एक escapeRegExp फ़ंक्शन का उपयोग कर सकते हैं। function escapeRegExp(string){ return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); } से developer.mozilla.org/en/docs/Web/JavaScript/Guide/... - Mark


String.prototype.includes() ईएस 6 में पेश किया गया था।

यह निर्धारित करता है कि एक स्ट्रिंग किसी अन्य स्ट्रिंग के भीतर पाई जा सकती है,   उचित के रूप में सही या गलत लौट रहा है।

वाक्य - विन्यास

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

पैरामीटर

searchString

इस स्ट्रिंग के भीतर एक स्ट्रिंग की खोज की जाएगी।

position

इस स्ट्रिंग में स्थिति जिस पर खोज शुरू करना है searchString 0 के लिए डिफ़ॉल्ट।

उदाहरण

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  

ध्यान दें

पुराने ब्राउज़र में इसे ES6 शिम की आवश्यकता हो सकती है।


167
2018-05-29 07:46



एफडब्ल्यूआईडब्ल्यू जुड़े एमडीएन पेज में एक साधारण शिम / पॉलीफिल है: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - Salman Abbas


यदि आप बदसूरत -1 चेक लिखने के विकल्प की तलाश में थे, तो आप इसके बजाय ~ tilde तैयार करते हैं।

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

जो ज़िमर्मन - आप देखेंगे कि ~ on -1 का उपयोग करके इसे 0 तक बदल दिया गया है। संख्या 0 ए है   झूठा मूल्य, जिसका अर्थ है कि यह परिवर्तित होने पर झूठी मूल्यांकन करेगा   एक बूलियन यह पहली बार एक बड़ी अंतर्दृष्टि की तरह प्रतीत नहीं होता है, लेकिन   इंडेक्सऑफ जैसे कार्यों को याद रखें जब क्वेरी नहीं होती है   मिल गया। इसका मतलब है कि इस तरह कुछ लिखने के बजाय:

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

अब आपके कोड में कम वर्ण हो सकते हैं ताकि आप इसे लिख सकें   इस तरह:

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

अधिक विवरण यहाँ


120
2017-09-13 03:45



हां, अब मैं ईएस 6 मानक पॉलीफिल की सिफारिश करता हूं includes() इसका पालन करके: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - Christian Landgren


कोड का यह टुकड़ा अच्छी तरह से काम करना चाहिए:

var str="This is testing for javascript search !!!";
if(str.search("for") != -1) {
   //logic
} 

82
2017-12-13 20:05



यह पारित चरित्र या शब्द की खोज करता है यदि यह पाया जाता है तो खोज एक पूर्णांक मान देता है जो संपूर्ण स्ट्रिंग में शब्द की स्थिति है। यदि कोई शब्द या कोई चरित्र नहीं मिला है तो यह फ़ंक्शन रिटर्न -1 खोजता है। - vaibhav


लिखने का एक आम तरीका है contains जावास्क्रिप्ट में विधि है:

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

बिटवाईट निषेध ऑपरेटर (~) बारी करने के लिए प्रयोग किया जाता है -1 में 0 (झूठा), और अन्य सभी मान गैर-शून्य (सत्य) होंगे।

डबल बुलियन नकारात्मक ऑपरेटर का उपयोग बुलियन में संख्या डालने के लिए किया जाता है।


77
2018-03-14 02:10



इसका क्या फायदा है !!~ ऊपर >-1? - alex
@alex, जादू संख्याओं पर निर्भर न होने के अलावा कोई विशेष लाभ नहीं है। आप जो सहज महसूस करते हैं उसका प्रयोग करें। - zzzzBov
@zzzzBov! ~~ जादू संख्या -1 पर उतना ही निर्भर है, और तथ्य यह है कि इसका थोड़ा सा प्रतिनिधित्व 0 का पूरक है। - Martijn
!!~this.indexOf(arg); संदर्भ में स्पष्ट नहीं है और संदर्भ में स्पष्ट नहीं है जैसा कि यह होना चाहिए। यह इस तथ्य पर भी निर्भर करता है ~-1 0 है, @Martijn के साथ सहमत हुए। इसके साथ -1 के साथ सरल तुलना की तुलना में धीमी है। लेकिन स्पष्टता मुख्य कारक है। - babinik
@ निक, मैंने कभी दावा नहीं किया कि यह एक था अच्छा रास्ता, मैंने अभी कहा था कि यह एक था सामान्य मार्ग। जहां तक ​​स्पष्टता का सवाल है, मुझे लगता है कि लाइब्रेरी के लिए कुछ बाइट्स को सहेजने का यह एक उचित तरीका है, लेकिन मैं उपयोग करता हूं foo.indexOf('bar') > -1 - zzzzBov


में ES5

var s = "foo";
alert(s.indexOf("oo") > -1);

में ES6 तीन नई विधियां हैं: includes(), startsWith(), endsWith()

var msg = "Hello world!";

console.log(msg.startsWith("Hello"));       // true
console.log(msg.endsWith("!"));             // true
console.log(msg.includes("o"));             // true

console.log(msg.startsWith("o", 4));        // true
console.log(msg.endsWith("o", 8));          // true
console.log(msg.includes("o", 8));          // false


76
2017-11-24 13:13



समर्थन w3schools.com/jsref/jsref_endswith.asp - zloctb