2017-06-23 68 views
0

好的,所以我知道如何做一个标准循环遍历字符串来查找匹配单个字符或单词的字符或单词,但在这种情况下,我有我正在寻找多个字符集。一些是字母,一些是字符(包括保护字符)。我不能将它分成空间或任何类似的字词数组,因为字符集可能没有空格,所以不会分割。我怀疑我将不得不做一个正则表达式,但我不知道如何设置它。这基本上是我试图做的伪代码,我会很感激关于如何前进的任何提示。我很抱歉,如果这是一件容易的事情,我错过了它,我仍在工作我的JavaScript。Javascript迭代寻找多个字符集的字符串

伪代码:

var string = "This *^! is abdf random&!# text to x*?ysearch for character sets"; 
var tempSet = []; 

// start a typical for loop 
for(string.length bla bla...){ 
    // look for one of those four character sets and if it hits one 
    if(foundSet == "abdf" | "x*?y" | "*^!" | "&!#") 
    // push that character set to the tempSet array 
    tempSet.push(foundSet); 
    // continue searching for the next set until the string is done 

console.log(tempSet); 
//expected result = ["*^!", "abdf", "&!#", "x*?y"] 

,所有的集合是在其出现的字符串

的顺序排列在那里,显然更多,但是这部分我可以处理。这是这条线

if(??? == "abdf" | "x*?y" | "*^!" | "&!#") 

我不知道如何处理。我怀疑它应该是某种类型的正则表达式,但是你可以像这样使用一个正则表达式在做if语句时?我用一个|来完成它们当做一个地图/替换,但我从来没有在循环中使用正则表达式。我也不知道如何让它一次搜索多个角色。一些字符集是3,一些是4个字符长。

我将不胜感激任何帮助,或者如果您有关于如何以更简单的方式来解决这个问题的建议,那将是非常棒的。

谢谢!

回答

1

您可以使用正则表达式。只需列出您的所有字符串作为|分隔的替代品。在正则表达式中具有特殊含义的字符(例如*,?,^,$)需要用\(您可以安全地转义任何非字母数字字符 - 有些字符是多余的)进行转义。

var string = "This *^! is abdf random&!# text to x*?ysearch for character sets"; 
 
var tempSet = string.match(/abdf|x\*\?y|\*\^!|&!#/g); 
 

 
console.log(tempSet);

如果你需要一个循环,你可以在一个循环中调用RegExp.prototype.exec()

var string = "This *^! is abdf random&!# text to x*?ysearch for character sets"; 
 
var regex = /abdf|x\*\?y|\*\^!|&!#/g; 
 
var tempSet = []; 
 
while (match = regex.exec(string)) { 
 
    tempSet.push(match[0]); 
 
} 
 
console.log(tempSet);

+0

谢谢,这是一个很大的帮助。我必须把它放在一个循环中,因为其他的东西需要根据发现的来完成,但是这个正则表达式给了我一个工作的起点。谢谢! – MandyM

+0

如果您需要循环,请查看'RegExp.exec()'方法来重复执行正则表达式并获取下一个匹配项。 – Barmar

+0

太好了,谢谢。我会检查出来的! – MandyM

1

我想你正在寻找的是includes()函数。

var sample = "This *^! is abdf random&!# text to x*?ysearch for character 
sets"; 
var toSearch = ["*^!", "abdf", "&!#", "x*?y"]; 
var tempSet = []; 

for (var i = 0; i < toSearch.length; i++) { 
    if (sample.includes(toSearch[i]){ 
     tempSet.push(toSearch[i]); 
    } 
} 

console.log(tempSet); 
//expected result = ["*^!", "abdf", "&!#", "x*?y"] 

通过这种方式,您可以遍历整个要搜索的任何字符串的数组,并将所有匹配元素推送到tempSet。

注意:这是区分大小写,所以请确保您考虑相应的检查。

+0

谢谢!我会玩这个。我把它放到jsfiddle中,我得到一个“未捕获的SyntaxError:无效或意外的令牌”,所以我会看看如果我能弄清楚。 :) – MandyM

+0

这是非常可能的,我犯了一个语法错误,希望那点你在正确的方向! – Kevin

+0

是的,它给了我一个开始,谢谢! – MandyM

1

超过Barmar出色的正则表达式的手动方法的位,但它是有趣的放在一起,并展示了作品也许更多一点明确:

var text = "This *^! is abdf random&!# text to x*?ysearch for character sets", 
 
    detect = ["abdf", "x*?y", "*^!", "&!#"], 
 
    haystack = '', 
 
    found = []; 
 

 
text.split('').forEach(function(letter){ 
 
    haystack += letter; 
 
    detect.forEach(function(needle){ 
 
     if (haystack.indexOf(needle) !== -1 
 
      && found.indexOf(needle) === -1) { 
 
      found.push(needle); 
 
     } 
 
    }); 
 
}); 
 

 
console.log(found);

+0

谢谢。我很高兴今晚能为你提供一些乐趣。 :) – MandyM