AS3中取字符串字符串的子字符串的方法大概有这三种:substr()、substring()、slice()。下面说一下三者的不同和相同之处:
<1> substr()方法: 原型: function substr(startIndex:Number = 0, len:Number = 0x7fffffff):String 返回一个子字符串,该子字符串中的字符是通过从指定的 startIndex 开始,按照 len 指定的长度截取所得的。原始字符串保持不变。
参数 startIndex:Number (default = 0) — 一个整数,指定用于创建子字符串的第一个字符的索引。如果 startIndex 是一个负数,则起始索引从字符串的结尾开始确定,其中 -1 表示最后一个字符。 len:Number (default = 0x7fffffff) — 要创建的子字符串中的字符数。默认值为所允许的最大值。如果未指定 len,则子字符串包括从 startIndex 到字符串结尾的所有字符。
<----------------------------------上面是帮助文档中的说明------------------------------------->
当参数为正数时,就不用说了,下面举个例子:var str:String = "0123456789"; trace("substr(1,3) = " + str.substr(1,3)); //输出结果:substr(1,3) = 123 , 即返回从编号为1的字符开始,截取3个字符的字符串; 下面看看当参数为负值的时候的结果, 1> 第一个参数为负数的时候,方法会自动将其转化为相应的正数,转换方法是从字符串最后开始向前数,-1表示最后一个字符,其实相当于String.length减去这个数的绝对值,例如startIndex=-5相当于startIndex=String.length-5,接着上面的例子:
trace("substr(-1,3) = " + str.substr(-1,3)); //输出结果: substr(-1,3) = 9 ; trace("substr(str.length-1,3) = " + str.substr(str.length - 1,3)); //输出结果: substr(str.length-1,3) = 9 显然两个结果是相同的
2> 第二个参数为负数时,第二个参数表示要截取子字符串的长度,常理来说是不可能为负数的,呵呵,但是为负数时同样可以有输出结果,多余的就不说了,其实这个和第一个参数基本是一样的,方法也会自动将其转换成一个正数对待,转换方法和第一个参数一样,即相当于String.length减去这个数的绝对值,例如startIndex=-3相当于len=String.length-3,接着上面的例子:
trace("substr(1,-4) = " + str.substr(1,-4)); //输出结果:substr(1,-4) = 123456; trace("substr(1,str.length-4) = " + str.substr(1,str.length - 4)); //输出结果:substr(1,str.length-4) = 123456; 显然两个结果是相同;
3> 两个参数都为负数时:也可以用上述方法计算,但是会出现一个错误,就是当(String.length - |startIndex|) + (String.length - |len|) >= String.length时,substr(startIndex,len)返回的是一个空字符串,而substr((String.length - |startIndex|) , (String.length - |len|))返回的是从String.length - |startIndex|开始到字符串结尾的字符串,如下:
trace("substr(-5,-5) = " + str.substr(-5,-5)); //输出结果:substr(-5,-5) = trace("substr(str.length-5,str.length-5)="+str.substr(str.length-5,str.length-5)); //输出结果:substr(str.length-5,str.length-5) = 56789 trace("substr(-5,-6) = " + str.substr(-5,-6)); //输出结果:substr(-5,-6) = 5678trace("substr(str.length-5,str.length-6)="+str.substr(str.length-5,str.length-6)); //输出结果:substr(str.length-5,str.length-6) = 5678 还有一种情况就是当startIndex + len >= String.length的时候,会返回字符串startIndex位置到字符串结尾的所有字符串;
<2> substring()方法: 原型: function substring(startIndex:Number = 0, endIndex:Number = 0x7fffffff):String 返回一个字符串,其中包含由 startIndex 指定的字符和一直到 endIndex - 1 的所有字符。如果未指定 endIndex,则使用 String.length。如果 startIndex 的值等于 endIndex 的值,则该方法返回一个空字符串。如果 startIndex 的值大于 endIndex 的值,则在执行函数之前会自动交换参数。原始字符串保持不变。 参数 startIndex:Number (default = 0) — 一个整数,指定用于创建子字符串的第一个字符的索引。startIndex 的有效值范围为从 0 到 String.length。如果 startIndex 是一个负值,则使用 0 。 endIndex:Number (default = 0x7fffffff) — 一个整数,它比所提取的子字符串中的最后一个字符的索引大 1。endIndex 的有效值范围为从 0 到 String.length。endIndex 处的字符不包括在子字符串中。默认为允许的最大索引值。如果省略此参数,则使用 String.length。如果此参数是一个负值,则使用 0。
<----------------------------------上面是帮助文档中的说明------------------------------------->
参数为正数时,也不多说了,特别要注意的一点是,输出的字符串不包括endIndex位置上的字符,即返回值是索引值为startIndex到endIndex - 1的子字符串,上面都很明了了,举个例子: trace("subString(1,3) = " + str.substring(1,3)); //输出结果:subString(1,3) = 12; 另外注意一点,当startIndex > endIndex时,方法会自动调换两者位置,例如
trace("subString(3,1) = " + str.substring(3,1)); //输出结果:subString(3,1) = 12;结果和第一个是一样的参数为负时,帮助文档也有说明,当参数为负数时,则会用0代替,例如: substring(-1, 3) == substring(0, 3); substring(1, -3) == substring(1, 0) == substring(0, 1);
<3> slice()方法: 返回一个字符串,该字符串包括从 startIndex 字符一直到 endIndex 字符(但不包括该字符)之间的所有字符。不修改原始 String 对象。如果未指定 endIndex 参数,此子字符串的结尾就是该字符串的结尾。如果按 startIndex 索引到的字符与按 endIndex 索引到的字符相同或位于后者的右侧,则该方法返回一个空字符串。 参数 startIndex:Number (default = 0) — 片段起始点的从 0 开始的索引。如果 startIndex 是一个负数,则从右到左创建片段,其中 -1 是最后一个字符。 endIndex:Number (default = 0x7fffffff) — 一个比片段终点的索引大 1 的整数。由 endIndex 参数索引的字符未包括在已提取的字符串中。如果 endIndex 是一个负数,则终点根据从字符串的结尾向后数确定,其中 -1 表示最后一个字符。默认为允许的最大索引值。如果省略此参数,则使用 String.length。
<----------------------------------上面是帮助文档中的说明------------------------------------->
参数为正数的时候,正常顺序和substring()方法的返回值是相同的,但是当startIndex > endIndex时参数不会自动调换两者位置,返回值为空字符串,如:
trace("slice(1,3) = " + str.slice(1,3)); //输出结果:slice(1,3) = 12;trace("slice(3,1) = " + str.slice(3,1)); //输出结果:slice(1,3) = ; 参数为负数时,与substr()方法的取值方式是一样的,方法会自动将其转化为相应的正数,转换方法是从字符串最后开始向前数,-1表示最后一个字符,其实相当于String.length减去这个数的绝对值,例如startIndex=-5相当于startIndex=String.length-5,下面是一些案例:
trace("slice(1,-3) = " + str.slice(1,-3));trace("slice(1,str.length-3) = " + str.slice(1,str.length-3));trace("slice(-1,3) = " + str.slice(-1,3));trace("slice(str.length-1,3) = " + str.slice(str.length-1,3)); trace("slice(-1,-3) = " + str.slice(-1,-3));
trace("slice(str.length-1,str.length-3) = " + str.slice(str.length-1,str.length-3));trace("slice(-3,-1) = " + str.slice(-3,-1));trace("slice(str.length-3,str.length-1) = " + str.slice(str.length - 3,str.length - 1)); 上例输出结果:
/***************************************** slice(1,-3) = 123456 slice(1,str.length-3) = 123456 slice(-1,3) = slice(str.length-1,3) = slice(-1,-3) =
slice(str.length-1,str.length-3) = slice(-3,-1) = 78 slice(str.length-3,str.length-1) = 78 *****************************************/
大家可以考虑一下上述输出结果中为空字符串的原因;