javascript檢查字元 - jquery字串包含




如何檢查字符串是否包含JavaScript中的子字符串? (20)

通常我會期望一個String.contains()方法,但似乎沒有。

檢查這個的合理方法是什麼?


String.prototype.indexOf()String.prototype.search()

正如其他人已經提到的,JavaScript字符串同時具有String.prototype.indexOfsearch方法。

兩者之間的關鍵區別在於indexOf僅用於普通子串,而search也支持正則表達式。 當然,使用indexOf的好處是它更快。

另請參見在JavaScript中,indexOf()和search()之間有什麼區別?

實現自己的String.prototype.contains()方法

如果你想為每個字符串添加你自己的contains方法,那麼最好的方法就是的方法:

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

你會像這樣使用它:

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

實現自定義實用程序庫

例如,通常不贊成將自己的自定義方法添加到JavaScript中的標準對象,因為它可能會破壞兼容性。

如果您真的需要自己的contains方法和/或其他自定義字符串方法,最好創建自己的實用程序庫並將自定義字符串方法添加到該庫:

var helper = {};

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

你會像這樣使用它:

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

使用第三方實用程序庫

如果您不想創建自己的自定義幫助程序庫,當然 - 始終可以選擇使用第三方實用程序庫。 正如所提到的,最受歡迎的是LodashLodash

在Lodash中,你可以使用_.includes() ,你可以這樣使用:

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

_.str.include() ,您可以使用_.str.include() ,您可以像這樣使用:

_.str.include('Hello World', 'orl');


ES6中有一個string.includes

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

請注意,您可能需要加載es6-shim或類似內容才能在舊版瀏覽器上使用它。

require('es6-shim')

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

你可以使用jQuery :contains selector。

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

在這裡檢查: contains-selector


使用內置且最簡單的一個,即字符串上的match() 。 要實現您期待的目標,請執行以下操作:

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");
}

var a  = "Test String";

if(a.search("ring")!=-1){
     //exist 
} else {
     //not found 
}

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


在JavaScript中編寫contains方法的常用方法是:

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

按位求反運算符( ~ )用於將-1變為0 (假),所有其他值將為非零(真值)。

double boolean negation運算符用於將數字轉換為布爾值。


在數組中使用contains方法的JavaScript代碼:

<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>

在給定的代碼中, contains方法確定指定的元素是否存在於數組中。 如果指定的元素存在於數組中,則返回true,否則返回false。


如果你正在尋找一種替代方法來編寫醜陋的-1檢查,那麼你可以先添加一個〜代替。

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

Joe Zimmerman - 你會看到使用~on -1將它轉換為0.數字0是一個假值,意味著它在轉換為布爾值時會計算為false。 這可能看起來不像是一個很大的洞察力,但是當找不到查詢時,記住像indexOf這樣的函數將返回-1。 這意味著不要寫類似於此的東西:

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

您現在可以在代碼中使用更少的字符,因此您可以像這樣編寫它:

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

更多細節在這裡


您可以使用JavaScript search()方法。

語法是: string.search(regexp)

它返回匹配的位置,如果未找到匹配則返回-1。

參見那裡的例子: jsref_search

您不需要復雜的正則表達式語法。 如果您不熟悉它們,可以使用簡單的st.search("title") 。 如果您希望測試不區分大小寫,那麼您應該進行st.search(/title/i)


您可以使用經過充分測試和記錄的庫,而不是使用網絡上此處和此處找到的代碼段。 我建議的兩個選項:

第一個選項:使用Lodash :它有一個includes方法:

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

Lodash是npm最受歡迎的javascript庫依賴項,並且有大量方便的javascript實用程序方法。 因此,對於許多項目,無論如何你都會想要這個;-)

第二個選項:或者使用Underscore.string :它有一個include方法:

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

這裡是Underscore.string的描述,它只增加了9kb,但是為您提供了經過充分測試和記錄的庫具有over copy'n'paste代碼片段的所有優點:

Underscore.string是用於使用字符串進行舒適操作的JavaScript庫,受Prototype.js,Right.js,Underscore和漂亮的Ruby語言啟發的Underscore.js的擴展。

Underscore.string為您提供了幾個有用的函數:capitalize,clean,includes,count,escapeHTML,unescapeHTML,insert,splice,startsWith,endsWith,titleize,trim,truncate等。

請注意,Underscore.string受Underscore.js的影響,但可以在沒有它的情況下使用。

最後不是最少:使用JavaScript版本ES6內置includes方法:

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

大多數現代瀏覽器已經支持它,請關注ES6兼容性表


您正在尋找.indexOf String.prototype.indexOf

indexOf將返回匹配的子字符串的索引。 索引將與子字符串的開始位置相關聯。 如果沒有匹配,則返回-1。 以下是該概念的簡單演示

var str = "Hello World"; // For example, lets search this string,
var term = "World"; // for the term "World",
var index = str.indexOf(term); // and get its index.
if (index != -1) { // If the index is not -1 then the term was matched in the string,
  alert(index); // and we can do some work based on that logic. (6 is alerted)
}


收集某種有效的解決方案:

var stringVariable = "some text";
var findString = "text";

//using `indexOf()`
var containResult1 = stringVariable.indexOf(findString) != -1;
document.write(containResult1+', ');

//using `lastIndexOf()`
var containResult2 = stringVariable.lastIndexOf(findString) != -1;
document.write(containResult2+', ');

//using `search()`
var containResult3 = stringVariable.search(findString) != -1;
document.write(containResult3+', ');
     
//using `split()`
var containResult4 = stringVariable.split(findString)[0] != stringVariable;
document.write(containResult4+'');


有一種更流暢,更好的方法,它使用(BitWise NOT)運算符。

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

按位不將“x”轉換為 - (x + 1)所以,如果x從indexOf方法變為-1,那麼它將轉換為 - (-1 + 1)= -0這是一個假值。


由於這個問題非常受歡迎,我認為我可以為代碼添加一些現代風格。

// 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`);

順便說一句,正確的答案是拼寫錯誤的indexOf或非標準的String.contains 。 加載外部庫(特別是如果代碼是用純JavaScript編寫的)或搞亂String.prototype或使用正則表達式有點矯枉過正。


簡單的解決方法

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

你可以用以下方式使用

"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參考


這樣做的另一個選擇是:

您可以使用匹配功能,即:

x = "teststring";

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

match()也可以使用正則表達式:

x = "teststring";

if (x.match(/test/i)) {
     // Code
}

這段代碼應該運行良好:

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






string-matching