一、项目需求
1 1、顺序替换--“您确定要花费{money}金币,来购买{amount}个红瓶吗?”2 2、全局替换--“{name},奖励所有人{money}人民币和{exp}美元。呵呵。”
二、函数的基本轮廓
1 public function printf( str:String, ... rest ):String2 {3 //... parse4 return string;5 }
三、顺序替换的实现
我们可以用正则来描述顺序替换中需要替换的关键词:\{[a-z0-9_]+\}这个正则所表示的意思:所以形如{字母/数字/下划线}的内容,并且你可能需要忽略大小写,最终为:/\{[a-z0-9_]+\}/i接着,我们只要用一个循环来遍历替换参数指定的值就行了。扩展:我们不但可以将rest直接传入多个数据参数,也可以传入将这些数据参数整合成一个数组来只传入一个参数四、全局替换的分析由于字符串替换方法replace好像只能替换第一个匹配的项,因此我们还得借助正则表达式来实现。实现方法:参数rest我们传入一个Object,例如{name:"天地会"},而这个Object的字段名与全局替换中的关键词{XXX}是相互对应的。如此就简单了,我们只要遍历这个Object,替换源字符串中所有相对应的关键词即可。五、最终代码1 package 2 { 3 4 /** 5 * 使用传入的各个参数替换指定的字符串内的{n}
标记。 6 * 7 * @param str - 用来进行替换的源字符串。 8 * @param rest - 可在 str 参数中的每个{n}
位置被替换的值。 9 * 如果第一个参数是一个数组,则该数组将用作参数列表。若第一个参数为数据对象,则会进行全局替换,否则为顺序替换。10 *11 *源字符串可包含
13 *{n}
形式的特殊标记,其中 n 为任意标识符(由字母、数字、下划线组成),12 * 它将被替换成具体的值。因为允许 rest 第一个参数为数组,因此允许在其它想要使用... rest 参数的方法中重复使用此例程。例如:14 *
15 * public function myTracer(str:String, ... rest):void16 * {17 * label.text += printf(str, rest) + "\n";18 * }19 * |
20 *21 * @return 使用指定的各个参数替换了所有 {n}
标记的新字符串。22 *23 *
24 * var str:String = "here is some info {number} and {boolean}";25 * trace(printf(str, 15.4, true));26 * 27 * // this will output the following string:28 * // "here is some info 15.4 and true"29 * |
你可以直接将以上代码,保存为一个AS3文件,来放到你的项目中使用。
注:养成写注释的习惯,是你成功和成长的其中一步。六、使用方法1 trace( printf( "您确定要花费{money}金币,来购买{amount}个红瓶吗?", 100, 5 ));2 trace( printf( "{name},奖励所有人{money}人民币和{exp}美元。呵呵。", { name: "看完这篇文章", money: 100, exp: 2000 }));
输出结果:
1 您确定要花费100金币,来购买5个红瓶吗?2 看完这篇文章,奖励所有人100人民币和2000美元。呵呵。