当前位置 : 首页 » 互动问答 » 正文

如何检查字符串是否包含JavaScript中的子字符串?

分类 : 互动问答 | 发布时间 : 2009-11-24 21:04:29 | 评论 : 30 | 浏览 : 5032772 | 喜欢 : 7463

通常我会期望一个 String.contains()方法,但似乎没有。

检查这个的合理方法是什么?

回答(30)

  • 1楼
  • 以下是当前可能性的列表:

    1. (ES6) includes转到

     var string =“foo”,
        substring =“oo”;
    string.includes(子串);
    

    2。 ES5及更早版本indexOf

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

    String.prototype.indexOf 返回另一个字符串中字符串的位置。如果没有找到,它将返回-1.

    3. search转到

     var string =“foo”,
        expr = / oo /;
    string.search(表达式);
    

    4。 lodash包含去回答

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

    5. RegExp去回答

     var string =“foo”,
        expr = / oo /; //这里没有引号
    expr.test(字符串);
    

    6. Match去回答

     var string =“foo”,
        expr = / oo /;
    string.match(表达式);
    

    性能测试显示indexOf可能是最佳选择,如果它涉及速度重要的点。

  • 2楼
  • 您可以使用以下语句轻松地将contains方法添加到String:

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

    Note:有关不使用此参数的有效参数,请参阅下面的注释。我的建议:使用你自己的判断。

    或者:

     if(typeof String.prototype.contains ==='undefined'){String.prototype.contains = function(it){return this.indexOf(it) != -1; }; }
  • 3楼
  • 您的代码存在的问题是JavaScript区分大小写。您的方法调用

    indexof()
    

    实际上应该

    indexOf()
    

    尝试修复它并查看是否有帮助:

     if(test.indexOf(“title”)!=  -  1){
        警报(ELM);
        foundLinks ++;
    }
  • 4楼
  • There is a string.includes in ES6:

     “土豆” .includes( “至”);
    >是的
    

    请注意,您可能需要加载es6-shim或类似内容才能在旧浏览器上运行。

     require('es6-shim')
  • 5楼
  • var index = haystack.indexOf(needle);
  • 6楼
  • 你可以使用JavaScript search() method.

    Syntax is: string.search(regexp)

    它返回匹配的位置,如果没有找到匹配则返回-1。

    参见那里的例子: jsref_search

    你不要不需要复杂的正则表达式语法。如果您不熟悉它们,可以使用简单的 st.search(“title”)。如果您希望测试不区分大小写,那么您应该 st.search(/ title / i).

  • 7楼
  • String.prototype.includes()在ES6中引入。

    确定是否可以在另一个字符串中找到一个字符串,   适当地返回true或false。

    Syntax

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

    Parameters

     searchString的
    

    要在此字符串中搜索的字符串。

    position
    

    此字符串中开始搜索 searchString 的位置默认为0.

    Example

     var str =“是或否这就是问题所在。“;
    
    console.log(str.includes(“To be”)); //真的
    的console.log(str.includes( “问题”)); //真的
    console.log(str.includes(“To be”,1)); // false 

    Note

    在旧浏览器中可能需要ES6 shim。

  • 8楼
  • 如果你正在寻找一种替代方法来编写丑陋的-1检查,那么你可以先添加一个〜代替。

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

    Joe Zimmerman - 您将看到使用~on -1将其转换为0.数字0是a   falsey值,表示转换为false时将评估为false   一个布尔值。这可能看起来不是一个很大的洞察力,但是   记住,当查询不是时,indexOf之类的函数将返回-1   找到。这意味着不要写类似的东西:

     if(someStr.indexOf(“a”)> = 0){
      // 找到了
    } else {
      // 未找到
    }
    

    您现在可以在代码中拥有更少的字符,以便您可以编写它   像这样:

     if(~someStr.indexOf(“a”)){
      // 找到了
    } else {
      // 未找到
    }
    

    More 详情请点击此处

  • 9楼
  • 这段代码应该运行良好:

     var str =“这是测试javascript搜索!!!”;
    if(str.search(“for”)!= -1){
       //逻辑
    }
  • 10楼
  • 在JavaScript中编写contains方法的常用方法 is:

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

    按位求反运算符(~)用于转换-1 into 0(falsey),所有其他值将为非零(真值)。

    使用双布尔否定运算符来转换数字成布尔值。

  • 11楼
  • In ES5

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

    In ES6有三种新方法:includes(), startsWith(), endsWith().

     var msg =“Hello world!”;
    
    的console.log(msg.startsWith( “你好”)); //真的
    的console.log(msg.endsWith() “!”); //真的
    的console.log(msg.includes( “O”)); //真的
    
    console.log(msg.startsWith(“o”,4)); //真的
    console.log(msg.endsWith(“o”,8)); //真的
    console.log(msg.includes(“o”,8)); //假

  • 12楼
  • 您可以使用经过充分测试和记录的库,而不是使用网络上此处和此处找到的代码段。我建议的两个选项:


    第一个选项: Use Lodash:它有一个includes method:

     _。includes('foobar','ob');
    //→真
    

    Lodash是npm最受欢迎的javascript库依赖项,并且有大量方便的javascript实用程序方法。因此,对于许多项目,无论如何你都会想要这个; - )


    第二个选项: Or use Underscore.string :它有一个include method:

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

    以下是Underscore.string的描述,它只增加了9kb,但是为您提供了经过充分测试和记录的库具有over copy'n'paste代码片段的所有优点:

    Underscore.string是一个舒适的JavaScript库操作   字符串,Underscore.js的扩展,受Prototype.js的启发,   Right.js,Underscore和漂亮的Ruby语言。

    Underscore.string为您提供了几个有用的功能:大写,   clean,includes,count,escapeHTML,unescapeHTML,insert,splice,   startsWith,endsWith,titleize,trim,truncate等。

    注意,Underscore.string受 Underscore.js 的影响但可以在没有它的情况下使用。


    最后不是最少:使用JavaScript版本ES6来自内置includes method:

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

    大多数现代浏览器已经支持它,请关注 ES6兼容性表.

  • 13楼
  • 你可以使用jQuery的:contains selector.

     $(“div:contains('John')”)
    

    在此处查看: contains-selector

  • 15楼
  • 执行此操作的另一个选项是:

    您可以使用匹配函数,即:

     x =“teststring”;
    
    if(x.match(“test”)){
         //代码
    }
    

    match()也可以使用正则表达式:

     x =“teststring”;
    
    if(x.match(/ test / i)){
         //代码
    }
  • 16楼
  • 您正在寻找.indexOfMDN.

    indexOf将返回匹配子字符串的索引。索引将与子字符串的开始位置相关联。如果没有匹配,则返回-1。这是该概念的 simple demo

     var str =“Hello World”; //例如,让我们搜索这个字符串,
    var term =“世界”; //对于“世界”一词,
    var index = str.indexOf(term); //并获取其索引
    if(index!= -1){//如果索引不是-1,那么该字符串在字符串中匹配,
      警报(索引); //我们可以根据这个逻辑做一些工作。 (6被警告)
    }

  • 17楼
  • 如上所述,您需要使用大写“O”调用indexOf。还应该注意,在JavaScript类中是保留字,您需要使用className来获取此数据属性。它可能失败的原因是因为它返回一个空值。您可以执行以下操作来获取类值...

     var test = elm.getAttribute(“className”);
    //要么
    var test = elm.className
  • 18楼
  • 这对我有用。它选择不包含术语“Deleted:”的字符串

     if(eventString.indexOf(“Deleted:”)== -1)
  • 19楼
  • 由于这个问题很受欢迎,我想我可以为代码添加一点现代风格。

     // const:创建一个不可变的常量
    const allLinks = document.getElementsByTagName(“a”);
    // [] .reduce.call:允许访问HTMLCollection上的reduce方法
    //()=> {}:ES6箭头功能
    const foundLinks = [] .reduce.call(allLinks,(sum,link)=> {
         //按位OR:将布尔值转换为数字
         return sum +(link.classList.contains(“title”)| 0);
    },0);
    
    //模板文字
    console.log(`找到$ {foundLinks ||“no”}标题类`);
    

    BTW,正确答案是拼写错误indexOf或非标准 String.contains 。 加载外部库(特别是如果代码是用纯JavaScript编写的)或搞乱 String.prototype or using a 正则表达式有点过分。

  • 20楼
  • 有一种更流畅,更好的方法,它使用(BitWise NOT)运算符。

     if(〜“John”.indexOf(“J”)){
      警报(“发现”)
    }
    其他{
      警报(“未找到”);
    }
    

    按位不将“x”转换为 - (x + 1)所以,如果x从indexOf方法变为-1,那么它将被转换为 - (-1 + 1)= -0这是一个假的价值。

  • 21楼
  • String.prototype.indexOf() or String.prototype.search()?!

    正如其他人已经提到的,JavaScript字符串同时具有indexOf and search method.

    两者之间的关键区别是indexOf仅用于普通子字符串,而search也支持正则表达式。当然,使用indexOf的好处是它更快。

    See also 在JavaScript中,indexOf()和search()有什么区别?.

    实现自己的 String.prototype.contains() method

    如果你想为每个字符串添加你自己的contains方法,最好的方法是@zzzzBov的方法:

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

    你会像这样使用它:

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

    实现自定义实用程序库

    通常不赞成将自己的自定义方法添加到JavaScript中的标准对象,例如,因为它可能会破坏兼容性。

    如果您真的想要自己的contains方法和/或其他自定义字符串方法,最好创建自己的实用程序库并将自定义字符串方法添加到该库:

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

    你会像这样使用它:

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

    使用第三方实用程序库

    如果您不想创建自己的自定义帮助程序库,当然 - 始终可以选择使用第三方实用程序库。如 @nachtigall 所述,最流行的是Lodash and Underscore.js .

    在Lodash中,你可以使用 _。includes() ,你可以这样使用:

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

    在Underscore.js中,你可以使用 _。str.include(),你可以这样使用:

     _。str.include('Hello World','orl');
  • 22楼
  • Example

    var a =“Test String”;
    
    如果(!a.search( “环”)=  -  1){
         //存在
    } else {
         //未找到
    }
  • 24楼
  • 简单的解决方法

     if(!String.prototype.contains){
      String.prototype.contains = function(){
        返回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参考

  • 25楼
  • 在数组中使用contains方法的JavaScript代码:

     <html>
        <HEAD>
            <h2>使用contains()方法</ h2>
            <SCRIPT>
                Array.prototype.contains = function(element){
                    for(var i = 0; i <this.length; i ++){
                        if(this [i] == element){
                            返回true;
                        }
                    }
                    返回虚假;
                }
                arr1 = [“玫瑰”,“印度”,“技术”];
                document.write(“条件是”+ arr1.contains(“India”)+“<br>”);
            </ SCRIPT>
        </ HEAD>
    
        <b> [如果指定的元素存在于数组中,则返回true
        返回false。] </ b>
    
    </ HTML>
    

    在给定代码中,contains方法确定指定的元素是否存在于数组中。如果指定的元素存在于数组中,则返回true,否则返回false。

  • 26楼
  • 收集某种有效的解决方案:

     var stringVariable =“some text”;
    var findString =“text”;
    
    //使用`indexOf()`
    var containsResult1 = stringVariable.indexOf(findString)!= -1;
    document.write(containsResult1 +',');
    
    //使用`lastIndexOf()`
    var containsResult2 = stringVariable.lastIndexOf(findString)!= -1;
    document.write(containsResult2 +',');
    
    //使用`search()`
    var containsResult3 = stringVariable.search(findString)!= -1;
    document.write(containsResult3 +',');
         
    //使用`split()`
    var containsResult4 = stringVariable.split(findString)[0]!= stringVariable;
    文件撰写(containResult4 + '');

  • 27楼
  • 由于存在关于使用原型的抱怨,并且因为使用indexOf会使您的代码不易读取,并且因为regexp是过度杀伤:

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

    这是我最终要做的妥协。

  • 28楼
  • JavaScript

    var str =“我的大字符串包含苹果和橘子”;
     var n = str.indexOf(“apples”);
     警报(N); //将提醒22,如果没有找到-1
    

    jQuery

     <p>我的大字符串包含苹果和橙子</ p>
      alert($(“p:contains(apples)”)[0]!= undefined); //如果找到则会发出警告
  • 29楼
  • 使用内置的和最简单的一个,即字符串上的match()。要实现您期待的目标,请执行以下操作:

     var stringData =“anyString Data”;
    
    var subStringToSearch =“any”;
    
    //如果匹配则返回子字符串,否则返回null
    var doesContains = stringData.match(subStringToSearch);
    
    if(doesContains!= null){
        alert(“包含子串”);
    }
  • 30楼
  • 最简单的方法确实是使用indexOf。要检查字符串string以查找子字符串substr,可以使用以下方法:

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

    正如你想要的函数 string.contains(),你可以像这样自己实现:

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

    现在您可以使用此ecen更短的方法来检查字符串是否包含特殊子字符串:

     string =“asdf”;
    警报(string.contains( “AS”));

    Here is a JSFiddle as well.

相关阅读:

Remove duplicates from an array of objects in JavaScript

Can I call jquery click() to follow an <a> link if I haven't bound an event handler to it with bind or click already?

Check whether a string matches a regex in JS

jQuery event to trigger action when a div is made visible

Check if user is using IE with jQuery

Resize HTML5 canvas to fit window

How to convert string to char array in C++?

How do I replace a character at a particular index in JavaScript?

How do I replace a character at a particular index in JavaScript?

JavaScript file upload size validation