计算一个字符串中某个字母出现的次数

3
问题很明确,是否可能在AS3中计算字符串中某个字母出现的次数并将该值返回给某个变量。
7个回答

9
function patternOccurrences(pattern:String, target:String):uint
    {
    return target.match(new RegExp(pattern, "g")).length;
    }

你的意思是?返回 target.match(new RegExp(pattern, target)).length; - redconservatory
不,我的意思是“g”(全局):http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/RegExp.html#RegExp() - Chunky Chunk

4
另一种选择是在字符串上使用 split(),并返回它的长度减1。对于基本需求,我发现这比使用 RegExp 更容易。
示例:
function getMatchCount(search:String, target:String):int {
    return target.split(search).length - 1;
}

trace( getMatchCount('a', 'aardvark') ); // 3
trace( getMatchCount('ball', 'volleyball baseball basketball football') ); // 4

这种方法的弱点是在搜索字符串开头或结尾的空格字符将无法被计算。 - krizajb

3

我对Actionscript或Flash的使用不是很熟悉 - 快速搜索得到以下结果:

function getEntranceNumber(mytext:String,myletter:String):Number
    {
        if( myletter.length>1)
        {
            trace("length of a letter should be equal to 1");
            return 0;
        }
        else
        {
            var total:Number = 0;
            var i:Number;
            for( i=0 ; i<mytext.length ; i++ )
            {
                if( mytext[i]==myletter[0] )
                    total++;
            }
            return total;
        }
    }

来源: http://www.actionscript.org/forums/showthread.php3?t=145412

编辑:这里有另一个链接,提供了关于同一主题的其他信息:

http://www.kirupa.com/forum/showthread.php?t=94654(我相信它甚至包括一个 .fla 脚本文件)


3

是的,这很明显,我一开始考虑过,但想着有没有办法在不通过字符串中所有字符的循环的情况下完成。看起来没有,但这对我起作用了。var strCount:uint = str.indexOf(String(find.text));for (var k:Number = 0; k < str.length; k++) { if (str.charAt(strCount) == str.charAt(k)) { numString++; times.text = numString.toString(); } } - 5et

2

一个使用正则表达式的解决方案:

trace(count("abcdefg", "a"));//1
trace(count("aacdefg", "a"));//2
trace(count("aacdeAg", "a"));//2
trace(count("aacdeaa", "a"));//4
trace(count("aacdeaa", "e"));//1
trace(count("eacdeae", "e"));//3
trace(count("eacdeae", "z"));//0
function count(s : String, letter : String) : int {
    return s.match(new RegExp(letter,"g")).length;
}

谢谢你的回答 看起来这是一个解决方案 我会尝试一下 - 5et

1

这个比正则表达式快20倍

function count(pattern:String, target:String) : uint {
    var count:uint=0;
    var index:int = -1;
    while((index = target.indexOf(pattern, index+1)) >= 0){
        count++;
    }
    return count;
}   

1
正则表达式对于这样一个简单的任务来说,我认为有点过头了。以下是最直接和非常有效的方法:
    static public function CountSingleLetter( where : String, what : String ):int
    {
        var count:uint = 0;
        for (var k:Number = 0; k < where.length; ++k )
        {
            if (where.charAt(k) == what )
            {
                ++count;
            }
        }
        return count;
    }

将此放入某个Utils类中或String.prototype中,即。
String.prototype.RemoveLastChar = function():String
{
    return this.substr(0, this.length - 1);
}

调用原型版本很不幸不是您所期望的:

line = line["RemoveLastChar"]();

用CountSingleLetter替换RemoveLastChar留给读者练习 :)

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