JavaScript:如果字符串在逗号分隔的字符串中

13
我有这样的字符串:str = "ball, apple, mouse, kindle",我有另一个要在此字符串中搜索的文本:search = 'apple'。如何使用JavaScript确定逗号分隔字符串中是否存在apple
注: str 可以带或不带逗号和下一项之间的空格。
9个回答

23

简单解决方案:

var str = "ball, apple, mouse, kindle";
var hasApple = str.indexOf('apple') != -1;

然而,如果str包含“苹果油炸圈”,它也将匹配:

var str = "ball, apple fritters, mouse, kindle";
var hasApple = str.indexOf('apple') != -1; // true

你可以采取不同的方法来更加精确。其中之一是在逗号上拆分字符串,然后迭代所有部分:

有多种方法可用于获取更具体的信息。其中一种方法是通过逗号分隔字符串,然后遍历所有部分:

var splitString = str.split(',');
var appleFound;
for (var i = 0; i < splitString.length; i++) {
    var stringPart = splitString[i];
    if (stringPart != 'apple') continue;

    appleFound = true;
    break;
}

注意:您可以使用内置的“some”方法简化该代码,但这仅适用于较新的浏览器。您也可以使用Underscore库,该库提供了自己的“some”方法,并可在任何浏览器中使用。

或者,您可以使用正则表达式来特定匹配“apple”:

var appleFound = /\Wapple,/.test(',' + str + ',');

然而,我认为你最好不要自行解决这个问题。每当你遇到类似的很普遍的问题时,最好的方法是利用现有的库。一个例子就是Underscore String库,特别是如果你已经在使用Underscore。如果没有,还有其他通用的字符串工具库(如String.js)可以使用。


10

为了确切地测试逗号分隔列表中是否存在精确的字符序列“apple”(而不仅仅是整个字符串的子串),您可以执行以下操作(考虑值之前和之后的可选空格):

如果Array#indexOf可用:

var items = str.split(/\s*,\s*/);
var isContained = items.indexOf('apple') > -1;
如果 Array#some 可用:

var items = str.split(/\s*,\s*/);
var isContained = items.some(function(v) { return v === 'apple'; });

使用正则表达式

var isContained = /(^|,)\s*apple\s*($|,)/.test(str);

Felix,你原本来自德国,对吧?抱歉这不是与软件相关的话题 ;) - doniyor
这是“完全匹配”的最佳答案,但我会将分割正则表达式更改为/\s*,\s*/编辑 - 不用了,你已经做到了。 - Karl-André Gagnon
我本以为你是来自克罗诺斯的克林贡人,真是让人失望。 - adeneo

3
您可以将字符串转换为数组并检查搜索字符串是否在其中。
var stuffArray = str.split(","); 
var SearchIndex = stuffArray.indexOf("Apple");

搜索索引(SearchIndex)表示在数组中的位置。如果SearchIndex < 0,则表示未找到该项。


如果列表中包含“苹果派”,那怎么办?你最终会得到一个错误的结果... - user2366842
在数组中使用索引需要精确匹配,因为你是通过逗号进行分割的,所以你会得到 ' Apple' 而不是 'Apple' - Karl-André Gagnon

3
您可以使用字符串的 split() 方法和数组的 indexOf() 方法来处理此类问题。
var str = "ball, apple, mouse, kindle";
var search = "apple";
var arr = str.split(", ");
if (arr.indexOf(search) !== -1) {
   alert('yes');
} else {
   alert('no');
}

3
这里已经有一些很好的答案了,但我想提供一种使用正则表达式的替代方法。这将不区分大小写,因此可以匹配'Apple'或'apple'。此外,它不会匹配“Appleby's”或“apple pie”,因此您将免受错误的结果干扰(或者可以更改正则表达式以包括这些内容)。
var str = "ball, apple, mouse, kindle";
var whatToFind = "apple";
var myRegEx = new RegExp(",\\s*" + whatToFind + "\\s*,", "i");
myRegEx.test(str);

以下是基本正则表达式,加入了一些测试,并封装成了函数:

var str = "ball, apple, mouse, kindle";
var str2 = "ball, apple pie, house,cat";
var str3 = "ball,Apple,house, cat";
var str4 = "ball,Appleby's, peach, dog";
strs = [str, str2, str3, str4];
var searchFor = "apple";


var matches = function (stringToSearch, whatToFind)
{
    var myRegEx = new RegExp(",\\s*" + whatToFind + "\\s*,", "i");
    return myRegEx.test(stringToSearch);
}

strs.forEach(function (st) {
    var confirm = " was ";
    if(matches(st, searchFor)==true)
        confirm = " was ";
    else
        confirm = " was not ";
    console.log( '"' + searchFor + '"' + confirm + "found in " + '"' + st + '"');
});

这是输出结果:

在“球,苹果,鼠标,Kindle”中找到了“苹果”

在“球,苹果派,房子,猫”中未找到“苹果”

在“球,苹果,房子,猫”中找到了“苹果”

在“球,Appleby's,桃子,狗”中未找到“苹果”


2

您可以采用非常简单但容易出错的方式,在逗号分隔的列表中检查字符串apple的索引:

var str = "ball, apple, mouse, kindle"
var index = str.indexOf('apple')
alert(index) 

检查结果为>-1表示str包含字符串apple。但是,这会导致误报,例如当str为以下内容时:

var str = "ball, crab apple, mouse, kindle"

这仍会为apple给您一个索引,该索引为>-1 - 这可能不是您想要的。


1
请注意,此代码需要使用jQuery库。
str = "ball, apple, mouse, kindle";
str_arr = str.split(',');
for (i = 0; i < str_arr.length; i++) { 
   if($.trim(str_arr[i]) === "apple"){
     alert('yiha i found an apple here. here it is: ' + str_arr[i]);
   }
}

1
请注意,这需要使用jQuery,并且您应该使用=== - Dave Morrissey

0

这里有另一种使用正则表达式的解决方案

//some test csv
var t = '1,2,3,4,32,apple,apple struddle,applestruddle,41,42,43';

现在在这里创建一个正则表达式'reg'..它可以像硬编码一样完成

var reg =  /(^|,\s{0,1})\bapple struddle\b(,|$)/;

或者以编程方式实现,例如
var check_value = "apple";
var reg = new RegExp("(^|,\\s{0,1})\\b" + check_value + "\\b(,|$)","g");

而你只需要简单地调用

if(reg.test(t)){
  console.log("apple .. no struddle!!");
}

关于正则表达式的注释:我在逗号后面加了一个\s{0,1},只是为了应对", "和","分隔符的情况。显然,你需要根据自己的间距要求进行调整;)

0
我尚未测试过性能,但我认为使用分离值的数组必须是其中一种简短而直接的解决方案。因此,我建议获取一个值的数组,并使用类似下面的inArray命令进行检查:
var str = "ball,apple,mouse,kindle";
var search = 'apple';

var strArray = str.split(',');
if ($.inArray(search, strArray) !== -1) {
  alert('hurrah :)');
} 
else {
  alert('nothing!');
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接