AS3中lastIndexOf()返回的意外值

时间:2015-03-08 06:15:47

标签: actionscript-3

我有lastIndexOf()返回的意外值:

        //cache = "\nWELCOME TO THE LOTTERY GAME\n\n\n\t• Play\nRules\nSettings\n"
        //text = "\t• Play\nRules\nSettings\n"

        var start:int = cache.indexOf(text); //output: start == 31
        var end:int = cache.lastIndexOf(text); //output: end == 31 <- unexpected value

end应该是cache.length - 1 = 54。怎么了?

2 个答案:

答案 0 :(得分:1)

lastIndexOf不返回匹配的结束位置,而是重新运行从结尾搜索的匹配的开始索引。如果存在多个匹配,则返回indexOf的不同值。例如:

s = "abcab"

此处indexOf("ab")将返回0而lastIndexOf("ab")将返回3.但lastIndexOf("ab")不会返回4.如果您想要匹配的结束索引,则必须添加匹配字符串的长度。

var end:int = cache.lastIndexOf(text) + text.length;

答案 1 :(得分:0)

可能是你预料到了错误的结果;)

你应该知道String.indexOf()String.lastIndexOf()之间的唯一区别是搜索的感觉,第一个函数是从左边开始(从位置0的字符开始),第二个函数是从从右边(来自位置string.length - 1的字符)并且它们都将返回搜索字符串的第一个字符与调用字符串相比的位置(如果它当然存在)。

示例:

var parent_string:String = 'hello world';
var parent_string_length:int = parent_string.length;

var child_string:String = 'world';
var child_string_length:int = child_string.length;

// h e l l o _ w o r l d
// 0 1 2 3 4 5 6 7 8 9 10

trace(parent_string.indexOf(child_string));     // gives : 6, it's the position of "w"
trace(parent_string.lastIndexOf(child_string)); // gives : 6, it's the position of "w"

为了更加理解,我将使用两个for循环来执行这些函数的操作:

String.indexOf():找到&#34; child_string&#34;的第一个索引in&#34; parent_string&#34;从左边开始:

// h e l l o _ w o r l d
// ->          *
// 0 1 2 3 4 5 6 7 8 9 10

for(var i:int = 0; i < parent_string_length; i++)
{
    var char:String = parent_string.charAt(i);
    var substr:String = parent_string.substr(i, child_string_length);

    trace(i + ') ' + char + ' : ' + substr + ' == ' + child_string + ' : ' + (substr == child_string));

    if(char == child_string.charAt(0)){ // if we find the first char of "child_string" in "parent_string"

        if(substr == child_string){
            // 
            trace('the first index of "' + child_string +'" in "' + parent_string + '", starting from the left, is : ' + i);
            break;
        }
    }
}

这个for循环给出:

0) h : hello == world : false
1) e : ello  == world : false
2) l : llo w == world : false
3) l : lo wo == world : false
4) o : o wor == world : false
5)   :  worl == world : false
6) w : world == world : true
the first index of "world" in "hello world", starting from the left, is : 6

String.lastIndexOf():找到&#34; child_string&#34;的第一个索引in&#34; parent_string&#34;从右边开始:

// h e l l o _ w o r l d
//             *       <-
// 0 1 2 3 4 5 6 7 8 9 10

for(i = parent_string_length - 1; i > 0; i--)
{
    char = parent_string.charAt(i);
    substr = parent_string.substr(i, child_string_length);

    trace(i + ') ' + char + ' : ' + substr + ' == ' + child_string + ' : ' + (substr == child_string));

    if(char == child_string.charAt(0)){ // if we find the first char of "child_string" in "parent_string"
        if(substr == child_string){
            trace('the first index of "' + child_string +'" in "' + parent_string + '", starting from the right, is : ' + i);
            break;
        }
    }
}

这个for循环给出:

10) d : d == world : false
9) l : ld == world : false
8) r : rld == world : false
7) o : orld == world : false
6) w : world == world : true
the first index of "world" in "hello world", starting from the right, is : 6

希望事情更加清晰,以及所有可以提供帮助的事情。