【问题标题】:Javascript iterate over string looking for multiple character setsJavascript遍历字符串寻找多个字符集
【发布时间】:2017-06-23 01:12:33
【问题描述】:

好的,所以我知道如何执行标准循环来遍历字符串以查找与单个字符或单词匹配的字符或单词,但在这种情况下,我有多个要查找的字符集。有些是字母,有些是字符(包括受保护的字符)。我无法将其拆分为空格或类似的单词数组,因为字符集可能没有空格,因此不会拆分。我怀疑我将不得不做一个正则表达式,但我不知道如何设置它。这基本上是我正在尝试做的伪代码,我将不胜感激有关如何前进的任何提示。如果这是一件容易的事情并且我错过了它,我深表歉意,我仍在研究我的 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 个字符长。

如果您对如何以更简单的方式解决此问题有任何建议,我将不胜感激。

谢谢!

【问题讨论】:

    标签: javascript regex string loops


    【解决方案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);

    【讨论】:

    • 谢谢,这是一个很大的帮助。我必须将它保持在一个循环中,因为需要根据找到的内容来完成其他事情,但是这个正则表达式给了我一个开始工作的起点。谢谢!
    • 如果需要循环,看一下RegExp.exec()方法,重复执行正则表达式,获取下一个匹配项。
    • 这对我来说非常有效。非常感谢您的出色回复!
    【解决方案2】:

    比 Barmar 出色的 RegEx 更像是一种手动方法,但拼凑起来很有趣,并且可能更清楚地显示各个部分:

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

    【讨论】:

    • 谢谢。我很高兴今晚能给你带来一些乐趣。 :)
    【解决方案3】:

    我认为您正在寻找的是 include() 函数。

    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。

    注意:这区分大小写,因此请务必相应地考虑您的检查。

    【讨论】:

    • 谢谢!我要玩这个。我把它放到 jsfiddle 中,我得到一个“未捕获的语法错误:无效或意外的令牌”,所以我会看看我是否能解决这个问题。 :)
    • 很可能我犯了语法错误,但希望能指出你正确的方向!
    【解决方案4】:

    如果可以的话,我会将此作为评论添加到 Kevin 的回答中,但如果您需要 IE 支持,您也可以查看 searchString.indexOf(searchToken) !== -1。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf

    【讨论】:

      猜你喜欢
      • 2011-08-27
      • 2013-05-29
      • 2013-01-18
      • 1970-01-01
      • 2021-06-30
      • 2010-11-17
      • 2018-05-15
      相关资源
      最近更新 更多