【问题标题】:How to return the frequency of a substring in a string?如何返回字符串中子字符串的频率?
【发布时间】:2013-11-18 07:40:28
【问题描述】:
function occurrence(string,substring) {
    var counter = 0;
    var sub = substring.toLowerCase();
    var str = string.toLowerCase(); 
    var array = []
    var ans;

    for (var i = 0; i < str.length; i++) {
        if (str.indexOf(sub) != -1) {
            array[counter] = str.indexOf(sub);
            counter += 1;
            ans = array.length
            alert(array); //tester to see inside array
        } else {
            ans = 0;
        }
    }
    return ans
}

alert(occurrence("Party arty art","art")) //tester to see function in action

在上面显示的测试器中,它应该打印出 3。但是使用我的代码,它会打印出字符串的长度。我正在尝试将“艺术”出现在字符串中的位置的索引存储在数组中,以便我可以打印出数组以给出出现次数。但是,当我警告循环内的数组时,它只会打印出“1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1”。

注意:我正在尝试使用尽可能少的内置函数来编写此代码。我是 javascript 的新手,所以非常感谢一些指导。

我也想在没有 .match() 的情况下写这个

【问题讨论】:

标签: javascript arrays string substring find-occurrences


【解决方案1】:

这样的事情呢?

function occurrence(string, substring) {
    var counter = 0;
    var sub = substring.toLowerCase();
    var str = string.toLowerCase(); 
    var array = [];
    var index = -1;

    do {
        index = str.indexOf(sub, index + 1);
        if (index != -1) {
            array[counter++] = index;
            i = index;
        }
    } while (index != -1);

    return counter; // or return array; if you want the indexes
}

【讨论】:

  • @VonnieVoong 很高兴我能帮上忙。如果此(或任何其他)答案解决了您的问题,请考虑接受最完整、最正确地解决您的问题的答案。这向其他用户表明该问题已得到解决,它可以帮助遇到类似问题的未来访问者知道该解决方案也可能对他们有所帮助。见What does it mean when an answer is "accepted"?。此外,一旦您获得 15 分或声望,您应该投票赞成任何您认为有用且写得好的答案。
【解决方案2】:

您是否考虑过进行正则表达式匹配?在这种情况下,这可能是最好的选择。

给你: (PS,在命名变量时,您可能希望避免使用“字符串”和“整数”等内置名称)

您需要创建一个函数来转义字符串中的任何正则表达式字符:...然后使用该函数。

function occurrence(str, substr) {
  var escaped = escapeFn(substr)
  var regex = new RegExp(escaped,"g")

  return str.match(regex).length

}

编辑:对不起,我一定错过了你说你不想使用匹配的底部。

【讨论】:

    【解决方案3】:

    可能想使用match():

    在字符串中搜索“ain”:

    var str = "The rain in SPAIN stays mainly in the plain"; 
    var res = str.match(/ain/g);
    

    res 的结果将是一个包含值的数组:

    一个,一个,一个

    所以对于你的例子,这样的事情可能会起作用:

    function occurrence(string, substring) {
        var counter = 0;
        var sub = new RegExp(escapeRegexStringCharactersFunction(substring.toLowerCase()),"g");
        var str = string.toLowerCase(); 
        var array = []
    
        array = str.match(sub);
        counter = array.length;
    
        return counter;
    }
    

    更简单:

    function occurrence(string, substring) { 
        var array = []
        var sub = new RegExp(escapeRegexStringCharactersFunction(substring),"gi");
        array = string.match(sub);
        return array.length;
    }
    

    【讨论】:

    • 该出现代码将不起作用并且会非常复杂(假设您想从子字符串中转义正则表达式)。但是您需要按照var re = new RegExp( escapeRegexStringCharactersFunction(substring), "g") 的方式做一些事情
    • 并且第二个示例中的array 变量被创建然后从未使用过
    • 感谢@megawac,对我的示例进行了更改。
    • 如果子字符串包含一些特殊的正则表达式字符(例如句点)怎么办。见stackoverflow.com/questions/3446170/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多